Mercurial > hg > Papers > 2010 > program-symposium
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間で同期を取ることが必要になる場合があるが、 そのような同期は、ここでは用意していない。