2012-07-29 2 views
0

я ожидал увидеть цифры от 0.0 до 999.0, но вместо того, чтобы получить некоторые очень странные и длинный номер для некоторых индексов для кода ниже:вычислив gridDim для CUDA ядра

__global__ void kernel(double *res, int N) 
{ 
    int i = (gridDim.y*blockIdx.y+ 
      blockIdx.x)*blockDim.x*blockDim.y+ 
      blockDim.y*threadIdx.y+threadIdx.x; 
    if(i<N) res[i] = i; 
} 

void callGPU(int N) 
{ 
dim3 dimBlock(8, 8); 
dim3 dimGrid(2, 8); 
... 
kernel<<<dimGrid, dimBlock>>>(res, N); 
... 
} 

даже если я изменить dimGrid к (8,2) и (1,16), но если я изменю gridDim на (16,1), то я получаю индексы вправо. PLZ вы можете показать, как правильно вычислить gridDim для этого случая? по возможности произвольному N. большое спасибо!

ответ

1

Ваш шаблон индексации неправильный. Во-первых, вы должны вычислить индекс на x и y.

int i_x = blockIdx.x * blockDim.x + threadIdx.x; 
int i_y = blockIdx.y * blockDim.y + threadIdx.y; 

Затем следует вычислить высоту как подсчет целых потоков по x размерности

int pitch = gridDim.x * blockDim.x; 

Наконец, Вы можете вычислить ваш индекс 1D от 2D сетки.

int i = i_y * pitch + i_x; 
Смежные вопросы