Я написал это ядро CUDA для игры Conway в жизни:
__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;
}
Я ищу ошибки/оптимизации. Параллельное программирование для меня совершенно новое, и я не уверен, как правильно это сделать.
Остальное - memcpy из входного массива в двумерный текст inputTex, связанный с массивом CUDA. Выходные данные выводятся из глобальной памяти на хост, а затем обрабатываются.
Как вы видите, поток имеет дело с одним пикселем. Я не уверен, что это самый быстрый способ, поскольку некоторые источники предлагают сделать строку или больше для потока. Если я правильно понимаю, что NVidia сама говорит, что чем больше потоков, тем лучше. Я хотел бы получить совет по этому поводу от кого-то с практическим опытом.