Программа CUDA возвращает неверные результаты - PullRequest
0 голосов
/ 07 февраля 2019

Я скопировал пример сложения векторов из книги "CUDA By Example" и получаю неожиданные неверные результаты.Вот мой код

#define N (33*1024)

__global__
void add(int *a, int *b,int *c){
    int tid = threadIdx.x+blockIdx.x*blockDim.x;

    while (tid < N){
        c[tid] = a[tid]+b[tid];
        tid+=blockDim.x*gridDim.x;
    }
}


int main()
{

    int a[N], b[N], c[N];
    int *dev_a, *dev_b, *dev_c;

    cudaMalloc((void**)&dev_a,N*sizeof(int));
    cudaMalloc((void**)&dev_b,N*sizeof(int));
    cudaMalloc((void**)&dev_c,N*sizeof(int));

    for(int i = 0 ; i<N;i++){
        a[i]= -i;
        b[i]= i*i;
    }

    cudaMemcpy(dev_a,a,N*sizeof(int),cudaMemcpyHostToDevice);
    cudaMemcpy(dev_b,b,N*sizeof(int),cudaMemcpyHostToDevice);
    cudaMemcpy(dev_c,c,N*sizeof(int),cudaMemcpyHostToDevice);

    add<<<128,128>>>(dev_a,dev_b,dev_c);

    cudaMemcpy(c,dev_c, N*sizeof(int), cudaMemcpyDeviceToHost);

    bool success=true;

    //print results
    for(int i=0; i<N;i++){

        if((a[i]+b[i])!=c[i]){
            printf("Error: %d + %d != %d\n",a[i],b[i],c[i]);
            success=false;
        }

    }

    if(success) printf("we did it!\n");
    cudaFree(dev_a);
    cudaFree(dev_a);
    cudaFree(dev_a);

    printf("done");
    return EXIT_SUCCESS;
}

, и я получаю кучу неверных результатов сложения, вот только несколько

Error: -33784 + 1141358656 != 255
Error: -33785 + 1141426225 != 0
Error: -33786 + 1141493796 != 0
Error: -33787 + 1141561369 != 0
Error: -33788 + 1141628944 != 4609792
Error: -33789 + 1141696521 != 0
Error: -33790 + 1141764100 != 4207408

и еще много много.Я начинающий CUDA, но я думаю, что я либо

A) неправильно скопировал код из книги ИЛИ

B) неверные результаты получены из-за того, что я использую CUDA 10, которыйвышел спустя много времени после того, как была написана эта книга

РЕДАКТИРОВАТЬ: я перезагрузил компьютер, и он работал

1 Ответ

0 голосов
/ 07 февраля 2019

Я могу повторить вашу ошибку, если я изменю свою конфигурацию.Возможно, что-то не так с вашей конфигурацией.Когда я использовал подходящие версии CUDA и драйвера, он работал после исправления незначительной опечатки:

cudaFree(dev_a); //this line is copied three times in your code

Пожалуйста, заверните ваш вызов cuda чем-то вроде следующего, чтобы проверить возвращаемое значение.Должно быть, одна из функций cuda завершилась сбоем.

#define CUDA_CHECK_RETURN(value) {                                                    \
        cudaError_t _m_cudaStat = value;                                              \
        if (_m_cudaStat != cudaSuccess) {                                             \
                fprintf(stderr, "Error %s at line %d in file %s\n",                   \
                                cudaGetErrorString(_m_cudaStat), __LINE__, __FILE__); \
                exit(1);                                                              \
        } }
//for example
     CUDA_CHECK_RETURN(cudaMemcpy(c,dev_c, N*sizeof(float), cudaMemcpyDeviceToHost));

Он должен сказать вам, что может пойти не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...