ядро cuda не меняет входные массивы - PullRequest
0 голосов
/ 05 сентября 2011

Кажется, что мое ядро ​​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?

1 Ответ

0 голосов
/ 21 сентября 2011

Я обнаружил, что значения N и numNets были значениями мусора.Смещение на N было неправильным, поэтому значения устанавливались вне массива.@pQB, твое предложение было именно тем, что мне было нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...