cudaMemcpyDeviceToHost中的错误结果

cudaMemcpyDeviceToHost中的错误结果,cuda,Cuda,我的第一个CUDA程序有问题。在其中,我尝试添加两个数组,但当我打印结果时,结果完全错误 这是我的代码: #include <stdio.h> const int N=10; __global__ void add(int *a, int *b, int *c) { int tid = threadIdx.x; c[tid] = a[tid] + b[tid]; } int main(){ int a[N], b[N], c[N]; int *dev

我的第一个CUDA程序有问题。在其中,我尝试添加两个数组,但当我打印结果时,结果完全错误

这是我的代码:

#include <stdio.h>

const int N=10;

__global__ void add(int *a, int *b, int *c) {
    int tid = threadIdx.x;
    c[tid] = a[tid] + b[tid];
}


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 );

    add<<<1,N>>>(dev_a, dev_b, dev_c);

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

    for (int i=0; i<N; i++) {
        printf("%d + %d = %d\n", a[i],b[i],c[i]);
    }

    cudaFree (dev_a); cudaFree (dev_b); cudaFree (dev_c);

    return 0;

}

最后,我为我的英语道歉。。。学习cuda后,我要做的下一件事就是改进它。

您的机器有问题。请这样做,你就会知道它是什么

当我编译并运行您的精确代码时,我得到以下信息:

$ ./t81
0 + 0 = 0
-1 + 1 = 0
-2 + 4 = 2
-3 + 9 = 6
-4 + 16 = 12
-5 + 25 = 20
-6 + 36 = 30
-7 + 49 = 42
-8 + 64 = 56
-9 + 81 = 72
$
这是您的代码修改错误检查。如果您编译并运行它,我相信您会发现您的机器有问题:

#include <stdio.h>

#define cudaCheckErrors(msg) \
    do { \
        cudaError_t __err = cudaGetLastError(); \
        if (__err != cudaSuccess) { \
            fprintf(stderr, "Fatal error: %s (%s at %s:%d)\n", \
                msg, cudaGetErrorString(__err), \
                __FILE__, __LINE__); \
            fprintf(stderr, "*** FAILED - ABORTING\n"); \
            exit(1); \
        } \
    } while (0)


const int N=10;

__global__ void add(int *a, int *b, int *c) {
    int tid = threadIdx.x;
    c[tid] = a[tid] + b[tid];
}


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) );
    cudaCheckErrors("cudamalloc fail");

    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 );
    cudaCheckErrors("cuda memcpy fail");

    add<<<1,N>>>(dev_a, dev_b, dev_c);

    cudaMemcpy(c, dev_c, N * sizeof(int),cudaMemcpyDeviceToHost );
    cudaCheckErrors("cudamemcpy or cuda kernel fail");
    for (int i=0; i<N; i++) {
        printf("%d + %d = %d\n", a[i],b[i],c[i]);
    }

    cudaFree (dev_a); cudaFree (dev_b); cudaFree (dev_c);

    return 0;

}
#包括
#定义cudaCheckErrors(msg)\
做{\
cudaError\u t\u err=cudaGetLastError()\
如果(_err!=cudaSuccess){\
fprintf(标准,“致命错误:%s(%s位于%s:%d)\n”\
msg,cudaGetErrorString(_err)\
__文件(行)\
fprintf(stderr,“***失败-中止\n”)\
出口(1)\
} \
}而(0)
常数int N=10;
__全局无效添加(int*a、int*b、int*c){
int tid=threadIdx.x;
c[tid]=a[tid]+b[tid];
}
int main(){
int a[N],b[N],c[N];
int*开发a、*开发b、*开发c;
cudamaloc((void**)和dev_a,N*sizeof(int));
Cudamaloc((void**)和dev_b,N*sizeof(int));
cudamaloc((void**)和dev_c,N*sizeof(int));
cudaCheckErrors(“Cudamaloc失败”);

对于(int i=0;我非常感谢您向我展示cudacheckerror,产生这些结果的原因是我的驱动程序比我的CUDA工具包旧,经过更改,它已经工作了。
#include <stdio.h>

#define cudaCheckErrors(msg) \
    do { \
        cudaError_t __err = cudaGetLastError(); \
        if (__err != cudaSuccess) { \
            fprintf(stderr, "Fatal error: %s (%s at %s:%d)\n", \
                msg, cudaGetErrorString(__err), \
                __FILE__, __LINE__); \
            fprintf(stderr, "*** FAILED - ABORTING\n"); \
            exit(1); \
        } \
    } while (0)


const int N=10;

__global__ void add(int *a, int *b, int *c) {
    int tid = threadIdx.x;
    c[tid] = a[tid] + b[tid];
}


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) );
    cudaCheckErrors("cudamalloc fail");

    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 );
    cudaCheckErrors("cuda memcpy fail");

    add<<<1,N>>>(dev_a, dev_b, dev_c);

    cudaMemcpy(c, dev_c, N * sizeof(int),cudaMemcpyDeviceToHost );
    cudaCheckErrors("cudamemcpy or cuda kernel fail");
    for (int i=0; i<N; i++) {
        printf("%d + %d = %d\n", a[i],b[i],c[i]);
    }

    cudaFree (dev_a); cudaFree (dev_b); cudaFree (dev_c);

    return 0;

}