Мое ядро cuda генерирует то, что подается на хост в конце выполнения блока.
Скелет выглядит следующим образом.
host_data, где данные записываются, выделяется как память, сопоставленная с хостом.
host_data_count также отображает память, которая указывает количество произведенных данных.
Графический процессор, который я использую, - это GTX 580 с архитектурой Fermi и CC 2.0.CUDA: атомная операция в общей памяти
__global__ void kernel(host_data, host_data_count)
{
__shared__ int shd_data[1024];
__shared__ int shd_cnt;
int i;
if (threadIdx.x == 0)
shd_cnt = 0;
__syncthreads();
while (...)
{
if (something happens)
{
i = atomicAdd(&shd_cnt, 1);
shd_data[i] = d;
}
}
__syncthreads();
if (threadIdx.x == 0)
{
i = atomicAdd(host_data_count, shd_cnt);
memcpy(&host_data[i], shd_data, shd_cnt * 4);
}
}
Что мне не хватает в этом коде ядра?
Может ли кто-нибудь помочь?
Не могли бы вы изменить свой вопрос, чтобы объяснить, в чем ваша проблема, потому что это очень неясно. Кроме того, если вам нужна помощь в исправлении конкретной части кода, напишите * фактический код *, который демонстрирует проблему и которую кто-то может компилировать и запускать. Отладка псевдокода очень сложна. – talonmies
Не могли бы вы также подтвердить, что вы компилируете свой код с помощью опции -arch = sm_20? – pQB
@pQB Да, для целевой архитектуры установлено значение sm_20 – superscalar