Tôi đã viết kernel CUDA này cho trò chơi của cuộc sống Conway:Làm thế nào để tối ưu hóa trò chơi cuộc sống của Conway cho 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;
}
Tôi đang tìm kiếm các lỗi/tối ưu hóa. Lập trình song song khá mới đối với tôi và tôi không chắc liệu tôi có làm cách nào để làm điều đó đúng không.
Phần còn lại là memcpy từ mảng đầu vào cho đầu vào kết cấu 2D được liên kết với mảng CUDA. Đầu ra là memcpy-ed từ bộ nhớ toàn cục đến máy chủ và sau đó được xử lý.
Như bạn có thể thấy một chuỗi giao dịch với một pixel. Tôi không chắc liệu đó có phải là cách nhanh nhất vì một số nguồn đề xuất thực hiện một hàng hay nhiều hơn cho mỗi luồng. Nếu tôi hiểu chính xác thì NVidia nói rằng càng nhiều chủ đề càng tốt. Tôi rất thích lời khuyên này từ một người có kinh nghiệm thực tế.
Bạn có thể muốn xem http://stackoverflow.com/questions/4438286/cuda-kernel-for-conways-game-of-life –
Tôi đã làm những gì mà 4438286 gợi ý. –
Ồ, xin lỗi, không đọc kỹ đủ. Lỗi của tôi. –