Я пытаюсь написать параллельный префикс сканирования на CUDA следуя tutorial -cuda общая память перезаписывается?
Я пытаюсь рабочую неэффективные «двойной буферизации один», как объяснено в руководстве.
Это то, что у меня есть:
// double buffered naive.
// d = number of iterations, N - size, and input.
__global__ void prefixsum(int* in, int d, int N)
{
//get the block index
int idx = blockIdx.x*blockDim.x + threadIdx.x;
// allocate shared memory
extern __shared__ int temp_in[], temp_out[];
// copy data to it.
temp_in[idx] = in[idx];
temp_out[idx] = 0;
// block until all threads copy
__syncthreads();
int i = 1;
for (i; i<=d; i++)
{
if (idx < N+1 && idx >= (int)pow(2.0f,(float)i-1))
{
// copy new result to temp_out
temp_out[idx] += temp_in[idx - (int)pow(2.0f,(float)i-1)] + temp_in[idx];
}
else
{
// if the element is to remain unchanged, copy the same thing
temp_out[idx] = temp_in[idx];
}
// block until all theads do this
__syncthreads();
// copy the result to temp_in for next iteration
temp_in[idx] = temp_out[idx];
// wait for all threads to do so
__syncthreads();
}
//finally copy everything back to global memory
in[idx] = temp_in[idx];
}
Можете ли вы указать на то, что случилось с этим? Я написал комментарии для того, что, как я думаю, должно произойти.
Это ядро призывание -
prefixsum<<<dimGrid,dimBlock>>>(d_arr, log(SIZE)/log(2), N);
Это сеточные и блок распределения:
dim3 dimGrid(numBlocks);
dim3 dimBlock(numThreadsPerBlock);
Проблема заключается в том, что я не получаю правильный выход для любого входа, более 8 элементов.
Можете ли вы добавить свой вызов ядра? И какая именно проблема? –
Каковы значения 'dimGrid' и' dimBlock'? – flipchart