私はライフゲームのために、このCUDAカーネルを書いた:私は、エラー/最適化のために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されてから処理されます。
ご覧のとおり、スレッドは1つのピクセルを扱います。いくつかのソースがスレッドごとに行を行うことを提案している最速の方法であるかどうかは分かりません。私が正しくNVidiaを理解している場合は、スレッドが多いほど良いと言います。私は実践的な経験を持つ人からこれに関する助言を愛するだろう。
http://stackoverflow.com/questions/4438286/cuda-kernel-for-conways-game-of-life –
私はすでに4438286が示唆していることをやっています。 –
ああ、申し訳ありませんが、十分によく読んでいませんでした。私の悪い。 –