ho scritto questo kernel CUDA per la partita di Conway della vita:Come ottimizzare il gioco della vita di Conway per 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;
}
Cerco errori/ottimizzazioni. La programmazione parallela è abbastanza nuova per me e non sono sicuro di sapere come farlo nel modo giusto.
Il resto è una memcpy da un array di input all'input di texture 2DTex associato a un array CUDA. L'output è memcpyed dalla memoria globale all'host e quindi gestito.
Come si può vedere un thread si occupa di un singolo pixel. Non sono sicuro che sia il modo più veloce in quanto alcune fonti suggeriscono di fare una riga o più per thread. Se capisco correttamente, gli stessi NVidia dicono che più thread, meglio è. Mi piacerebbe consigli su questo da qualcuno con esperienza pratica.
Si potrebbe voler guardare http://stackoverflow.com/questions/4438286/cuda-kernel-for-conways-game-of-life –
Sto già facendo ciò che 4438286 suggerisce. –
Oh, scusa, non ho letto abbastanza da vicino. Colpa mia. –