CUDA内核参数不兼容

时间:2014-06-06 12:25:33

标签: c cuda

我不知道出了什么问题,我想把两个向量加在一起,但是我得到了一个错误。 我查看了一些教程,但我没有看到问题 这是我的错误:

  

类型的参数" int **"与" int *"

类型的参数不兼容
#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <stdio.h>


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

int main()
{

    const int arraySize = 5;
    int a[arraySize] = { 1, 2, 3, 4, 5 };
    int b[arraySize] = { 10, 20, 30, 40, 50 };
    int c[arraySize] = { 0 };

    int *d_a[arraySize];
    int *d_b[arraySize];
    int *d_c[arraySize];

    cudaMalloc((void **)&d_a, arraySize*sizeof(int));
    cudaMalloc((void **)&d_b, arraySize*sizeof(int));
    cudaMalloc((void **)&d_c, arraySize*sizeof(int));

    cudaMemcpy(d_a, a, arraySize*sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(d_b, b, arraySize*sizeof(int), cudaMemcpyHostToDevice);

    dim3 block(5, 1, 1);
    dim3 grid(1, 1, 1);

    addKernel<<<block,grid>>>(d_c, d_a, d_b);

    cudaMemcpy(c, d_c, arraySize*sizeof(int), cudaMemcpyDeviceToHost);

    cudaFree(d_a);
    cudaFree(d_b);
    cudaFree(d_c);

    printf("{1,2,3,4,5} + {10,20,30,40,50} = {%d,%d,%d,%d,%d}\n",
        c[0], c[1], c[2], c[3], c[4]);

    getchar();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

编译器警告非常清楚。这样:

int *d_a[arraySize];
int *d_b[arraySize];
int *d_c[arraySize];

不正确,几乎肯定不是你想要的。您已声明d_ad_bd_c中的每一个都是指针数组,这与内核声明冲突(并且没什么意义,因为它看起来像对于abc的设备版本,您只需要一个指针。

我怀疑你的意思实际上是

int *d_a;
int *d_b;
int *d_c;

如果进行了更改,代码应该可以编译。