Общий массив CUDA не получает значения? - PullRequest
0 голосов
/ 12 февраля 2012

Я пытаюсь реализовать простое параллельное сокращение. Я использую код из CUDA SDK. Тем не менее, в моем ядре есть проблема, поскольку разделяемый массив не получает значения глобального массива и все его нули.

extern __ shared __ float4 sdata[];

// each thread loadsone element from global to shared mem

unsigned int tid = threadIdx.x;

unsigned int i= blockIdx.x*blockDim.x+ threadIdx.x;

sdata[tid] = dev_src[i];

__syncthreads();

// do reduction in shared mem

for(unsigned int s=1; s < blockDim.x; s *= 2) {

if(tid % (2*s) == 0){

sdata[tid] += sdata[tid + s];

}

__syncthreads();

}
// write result for this block to global mem

if(tid == 0)

out[blockIdx.x] = sdata[0];

EDIT ::

Хорошо, я заработал, убрав ключевое слово extern и сделав общий массив постоянным размером, например 512. Сейчас я в хорошей форме. Может быть, кто-то может объяснить, почему он не работает с ключевым словом extern

1 Ответ

2 голосов
/ 12 февраля 2012

Мне кажется, я знаю, почему это происходит, поскольку я сталкивался с этим раньше. Как вы называете ядро?

Помните, что при вызове kernel<<<blocks,threads,sharedMemory>>> sharedMemory должен быть размером разделяемой памяти в байтах. Итак, если вы объявляете для 512 элементов, третий параметр должен быть 512 * sizeof (float4). Я думаю, что вы просто звоните, как показано ниже, что неправильно

kernel<<<blocks,threads,512>>>   // this is wrong

Надеюсь, что поможет

...