view 12.tex @ 0:a9fda18657b3 default tip

add
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 16 Dec 2009 10:05:04 +0900
parents
children
line wrap: on
line source

\section{ より複雑な例 (明示的なDMA)}

以下は、ポリゴンのデータから、Span (同じy座標を持つ直線)を抜き出す
処理に出て来る、SpanPack(Spanの集合)の書き出し部分である。

{\small
{\small
\begin{verbatim}
 if (charge_y_top <= y && y <= charge_y_end) {
    int index = (y-1) / split_screen_h;
    /**
     * 違う SpanPack を扱う場合、
     * 現在の SpanPack をメインメモリに送り、
     * 新しい SpanPack を取ってくる
     */
    if (index != g->prev_index) {
	tmp_spack = g->spack;
	g->spack = g->send_spack;
	g->send_spack = tmp_spack;

	smanager->dma_wait(SPAN_PACK_STORE);
	smanager->dma_store(g->send_spack, 
              (memaddr)spackList[g->prev_index],
	    sizeof(SpanPack), SPAN_PACK_STORE);
	
	smanager->dma_load(g->spack, 
            (memaddr)spackList[index],
	       sizeof(SpanPack), SPAN_PACK_LOAD);
	g->prev_index = index;
	smanager->dma_wait(SPAN_PACK_LOAD);
    }
\end{verbatim}
}

}

ここでは、明示的に書き出し領域をDMAで、読み書きしている。この部分を
get\_segment で書き換えることも可能であるが、例として敢えて持って来ている。
dma\_wait が先行しているのは、前のdma\_store との処理がパイプライン的に
行われているためである。

この場合は書込処理なので、SPE間で同期を取ることが必要になる場合があるが、
そのような同期は、ここでは用意していない。