Функция 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);
                 ^^

Я думаю, у тебя будут лучшие результаты.

Другие вопросы по тегам