Функция CUDA для увеличения значений массива
Когда я использую этот код в cuda, он только увеличивает a[0],a[1],a[2] other было 0 (не увеличилось)
__global__ void inc2(int * a){
int i= threadIdx.x;
i%=10;
atomicAdd(&(a[i]),1);
}
когда я пишу
__global__ void inc2(int * a){
int i= threadIdx.x;
i%=10;
atomicAdd(&(a[6]),1);
}
это не увеличило [6]
в чем дело? извиняюсь
весь код это
__global__ void inc2(int * a){
int i= threadIdx.x;
i%=10;
atomicAdd(&(a[6]),1);
}
int main()
{
//=============================================
int aaa[10]={0};
int *q;
cudaMalloc((void**)&q,100);
cudaMemcpy(q,aaa,10,cudaMemcpyHostToDevice);
inc2<<<100,100>>>(q);
cudaMemcpy(aaa,q,10,cudaMemcpyDeviceToHost);
printf("\n\n");
for(int i=0;i<10;i++){
printf("%d\t",aaa[i]);
}
cudaFree(q);
return 0;
}
1 ответ
Решение
Прежде всего, вы должны использовать правильную проверку ошибок cuda каждый раз, когда у вас возникают проблемы с кодом CUDA.
Вы можете быть смущены параметрами размера, связанными с такими функциями, как cudaMalloc
или же cudaMemcpy
, Они представляют размер в байтах. Итак, это:
cudaMemcpy(aaa,q,10,cudaMemcpyDeviceToHost);
передает только 10 байтов, что составляет 2,5 int
величины. Если вы хотите увидеть измененное значение a[6]
, вам придется переводить больше, чем первые 2 int
количество в a
,
Если вы измените эти строки:
cudaMemcpy(q,aaa,40,cudaMemcpyHostToDevice);
^^
а также:
cudaMemcpy(aaa,q,40,cudaMemcpyDeviceToHost);
^^
Я думаю, у тебя будут лучшие результаты.