コンウェイのライフ ゲーム用に、次の CUDA カーネルを作成しました。
__global__ void gameOfLife(float* returnBuffer, int width, int height) {
unsigned int x = blockIdx.x*blockDim.x + threadIdx.x;
unsigned int y = blockIdx.y*blockDim.y + threadIdx.y;
float p = tex2D(inputTex, x, y);
float neighbors = 0;
neighbors += tex2D(inputTex, x+1, y);
neighbors += tex2D(inputTex, x-1, y);
neighbors += tex2D(inputTex, x, y+1);
neighbors += tex2D(inputTex, x, y-1);
neighbors += tex2D(inputTex, x+1, y+1);
neighbors += tex2D(inputTex, x-1, y-1);
neighbors += tex2D(inputTex, x-1, y+1);
neighbors += tex2D(inputTex, x+1, y-1);
__syncthreads();
float final = 0;
if(neighbors < 2) final = 0;
else if(neighbors > 3) final = 0;
else if(p != 0) final = 1;
else if(neighbors == 3) final = 1;
__syncthreads();
returnBuffer[x + y*width] = final;
}
エラー/最適化を探しています。並列プログラミングは私にとってまったく新しいものであり、それを正しく行う方法がわからない。
残りは、入力配列から CUDA 配列にバインドされた 2D テクスチャ inputTex への memcpy です。出力は、グローバル メモリからホストに memcpy されてから処理されます。
ご覧のとおり、スレッドは単一のピクセルを処理します。一部の情報源は、スレッドごとに行以上を実行することを提案しているため、それが最速の方法であるかどうかはわかりません。私が正しく理解していれば、NVidia自身は、スレッドが多いほど良いと言っています。これについては、実務経験のある方からのアドバイスをいただければ幸いです。