Кажется, что мое ядро CUDA не изменяет значения массивов, которые я передаю, вот соответствующий код хоста:
dim3 grid(numNets, N);
dim3 threads(1, 1, 1);
// allocate the arrays and jagged arrays on the device
alloc_dev_memory( state0, state1, d_state0, d_state1,
adjlist, d_adjlist, transfer, d_transfer,
indeg, d_indeg, d_N, d_K, d_S,
d_Spow, d_numNets );
// operate on the device memory
kernel<<< grid, threads >>>( d_state0, d_state1, d_adjlist, d_transfer, d_indeg,
d_N, d_K, d_S, d_Spow, d_numNets );
// copy the new states from the device to the host
cutilSafeCall( cudaMemcpy( state0, d_state0, ens_size*sizeof(int),
cudaMemcpyDeviceToHost ) );
// copy the new states from the array to the ensemble
for(int i=0; i < numNets; ++i)
nets[i]->set_state( state0 + N*i );
Вот код ядра, который называется:
// this dummy kernel just sets all the values to 0 for checking later.
__global__ void kernel( int * state0,
int * state1,
int ** adjlist,
luint ** transfer,
int * indeg,
int * d_N,
float * d_K,
int * d_S,
luint * d_Spow,
int * d_numNets )
{
int N = *d_N;
luint * Spow = d_Spow;
int tid = blockIdx.x*N + blockIdx.y;
state0[tid] = 0;
state1[tid] = 0;
for(int k=0; k < indeg[tid]; ++k) {
adjlist[tid][k] = 0;
}
for(int k=0; k < Spow[indeg[tid]]; ++k) {
transfer[tid][k] = 0;
}
}
Затем, после использования cudaMemcpy для возврата массива state0 на хост, если я перебираю state0 и отправляю все значения в стандартный вывод, они совпадают с начальными значениями, даже если мое ядро написано для установки всех значений в ноль.
Ожидаемый результат должен быть начальным значением state0: 101111101011, за которым следует конечное значение state0: (все нули)
Пример выполнения этого кода выводит:
101111101011
101111101011
Press ENTER to exit...
Во второй строке должны быть все нули. Почему это ядро CUDA не влияет на массив state0?