c++ - 参数与相同类型的参数不兼容

标签 c++ cuda gpgpu

我一直在练习编写 CUDA 代码并学习大规模并行编程背后的结构和理念。不管怎样,我遇到了一个我不太明白的问题。

代码如下:

#include <cuda_runtime.h>
#include <stdio.h>
#include <math.h>

__global__ void cudaTest(struct led* input[])
{
    int ledNum = blockIdx.x * blockDim.x + threadIdx.x;
}

int main()
{
    struct led
    {
        unsigned char red, green, blue;
    };

    struct led* input[1200];
    struct led* dInput[1200];

    cudaMalloc((void**)&dInput, sizeof(struct led) * 1200);
    cudaMemcpy(dInput, input, sizeof(struct led) * 1200,     cudaMemcpyHostToDevice);
    cudaTest<<<4, 300>>>(dInput);
    cudaMemcpy(input, dInput, sizeof(struct led) * 1200,    cudaMemcpyDeviceToHost);
    cudaDeviceSynchronize();
    cudaFree(dInput);

    printf("Input: %d", *input);

}

我遇到的问题是在编译程序时:

testCuda.cu(22): 错误:“led **”类型的参数与“led **”类型的参数不兼容

cudaTest<<<4, 300>>>(dInput);

出于显而易见的原因,我不明白这一点……它说本质上相同的东西与自身不兼容。

我不知道这是否是我为数组分配内存的方式、我初始化它的方式或其他方面的问题。非常感谢任何帮助。

编辑:仅在某些情况下,此代码没有应用程序,它是一个测试程序,我在将代码实现到我的项目中之前用来测试代码。这个程序的目标很简单,就是在GPU上为一个数组分配空间,传给GPU,调用内核,再传回来。

最佳答案

当编译器第一次在您的内核函数中遇到它作为参数类型时,它不知道您的 struct led 是什么。因此,您需要在使用它之前定义该结构类型,即使作为函数参数也是如此。您拥有的这种构造在普通 C 或 C++ 中无法正常工作,因此此处的基本概念并非特定于 CUDA。

此外,对于 dInput,我们不会为打算用作设备指针的指针创建主机分配。所以只需声明裸指针,然后在 cudaMalloc 中使用它来将设备分配附加到它。

试试这个,而不是你拥有的:

 #include <cuda_runtime.h>
 #include <stdio.h>
 #include <math.h>

 struct led
 {
    unsigned char red, green, blue;
 };

 __global__ void cudaTest(led *input)
 {
    int ledNum = blockIdx.x * blockDim.x + threadIdx.x;
    input[ledNum].red = 5;
 }

 int main()
 {

    led* input = new led[1200];
    led* dInput;

    cudaMalloc((void**)&dInput, sizeof(struct led) * 1200);
    cudaMemcpy(dInput, input, sizeof(struct led) * 1200,     cudaMemcpyHostToDevice);
    cudaTest<<<4, 300>>>(dInput);
    cudaMemcpy(input, dInput, sizeof(struct led) * 1200,    cudaMemcpyDeviceToHost);
    cudaDeviceSynchronize();
    cudaFree(dInput);

    printf("Input: %d", input[0].red);

 }

关于c++ - 参数与相同类型的参数不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37598353/

相关文章:

c++ - CUDA __host__ __device__ 变量

c++ - "\x"在字符串中如何工作?

c++ - 将 char* 数组合并到 uint16_t

c++ - 在 CUDA 上需要有关 2D 纹理的帮助。没有得到我想要的索引的预期值

c++ - Visual Studio 2012 - 无法打开源文件

c - 处理来自 OpenCL 内核的字符串

c++ - 二维矩形的 boolean 运算

c++ - 单例类中未解析的外部符号

cufftcomplex.h 程序员引用/文档

CUDA 7.5 安装 : Unsupported compiler error