Cell Broadband Engineを利用したホログラム計算(後編)
ホログラムに変換する計算式は,次に示すようなcos関数の重ね合わせです.以下の式に物体点の座標を入力していくと,ホログラム上のある座標における計算値が求まります.
ここで,添え字のαはホログラム上の点を,jは物体を構成する点を表しています.x,y,zは座標を表し,xαj=xα-xj,yαj=yα-yjです.Ajは物体光の強度,λは参照光の波長,Nは物体点の総数です.
ホログラムの画素数をMとすると,1枚の計算機合成ホログラムを作成するために上の式のcos計算をM×N回行う必要があり,リアルタイムに動画を再生するためには30フレーム/s程度のビデオ・レートが要求されます.そのための計算量は膨大であり,計算機合成ホログラムを用いた電子ホログラフィによる3次元テレビの実用化には,今後10年~20年を要するともいわれています.
実際にはホログラムに変換する計算式をコンピュータに実装して計算するわけですが,この式の場合,計算するホログラムの各画素間に依存関係(ある画素Aの計算結果を別の画素Bの計算で用いるなど)がありません.非常に並列処理しやすい計算であることが知られています.
この特徴を利用して,計算機合成ホログラムの計算プログラムをCBEに移す際に高速化を図ります.計算用のデータの読み込みなどはPPE側でしか実行できないので,PPEに任せます.その後の実際の計算式の部分はSPEに実装します.
以下に,実際のPPEとSPEのプログラムの一部(CBE特有の部分)を示しながら,CBEのプログラミングについて解説します.
● PPE用プログラムを作成する
PPEのプログラムの大きな特徴は,プログラム内でSPEプログラムのスレッドの呼び出し(または終了)を確認して停止させる関数群と,SPEプログラムがDMA転送を利用してメイン・メモリからデータを転送するためにデータを格納・加工する部分です.以下に例を挙げて解説します.
1)ライブラリのインクルード
PPEからSPEを利用するためのlibespe2ライブラリとスレッドの生成や管理などを行う関数群を持つpthreadライブラリをインクルードします〔リスト1(a)〕.
#include <libspe2.h>
#include <pthread.h>
2)DMA転送用領域の確保
まず,SPEプログラムに渡す入力データと出力データのための領域を宣言します.
DMA転送に用いるパラメータをまとめた構造体を作成し,メイン・メモリ上にDMA転送用パラメータの領域を確保します.DMA転送を行うデータは,基本的に16バイトの倍数になります.DMA転送では128バイトが最適なので,__attribute__キーワードを指定してバイト境界を128バイトにそろえます〔リスト1(b)〕.
typedef struct{
KATA *dataPos; // メイン・メモリ上の演算用データ格納場所
KATA *resultPos; // メイン・メモリ上の演算結果格納場所
char pat[] __attribute__((aligned(128)));
// データ・サイズ調整用
}DmaParams __attribute__((aligned(128)));
static volatile DmaParams dmaParams[NUM_SPE] __attribute__((aligned(128)));
また,メイン・メモリ上に結果格納用の領域を確保します〔リスト1(c)〕.
static volatile unsigned char result __attribute__((aligned(128)));