参数与同一类型的参数不兼容

Posted

技术标签:

【中文标题】参数与同一类型的参数不兼容【英文标题】:Argument is incompatible with a parameter of the same type 【发布时间】:2016-06-02 17:21:48 【问题描述】:

我一直在练习编写 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,调用内核,然后将其传回。

【问题讨论】:

抱歉,已删除标签。 是的,但我明白他在说什么,要理解这一点,您需要的不仅仅是 C 知识。 @Olaf 这不是related 到 C 吗?? @2501:因为 CUDA 不是 C,而是基于 C++。仔细阅读代码。 @WaffleMan0310:C 和 C++ 是不同的语言。 CUDA 是基于 C++ 的! 【参考方案1】:

当编译器第一次遇到您的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);

 

【讨论】:

请不要只发布代码而不解释问题所在。 对于一个人来说,你声明了一个指向 led 结构的指针数组。而不是一个指向 led 数组的指针,这看起来不像你想做的那样。我刚刚发布了答案作为我没有时间尝试的建议,因为我正在工作:) 我只是希望这能让对话朝着正确的方向发展,以便您得到答案。 我进行了一些编辑,将您的答案转换为正确的代码,同时也解决了@Olaf 提出的问题。如果您反对,请随时回滚编辑。 @RobertCrovella:虽然我很欣赏您的编辑,但这实际上是您的答案,而不是 Rob 的答案。帮助低次数的回答者是可以接受的,但是如果超过 1k7 次,他真的应该知道它是如何工作的,并且能够自己提供正确和完整的答案。无论如何,我现在将删除 DV。

以上是关于参数与同一类型的参数不兼容的主要内容,如果未能解决你的问题,请参考以下文章

类型的参数与类型错误的参数不兼容[重复]

“char *”类型的参数与“LPWSTR”类型的参数不兼容

“void(*)(int wall)”类型的 C++ 参数与“int”类型的参数不兼容

Nil与预期的参数类型UIViewAnimationOptions不兼容

Nil 与预期的参数类型“JSON”不兼容

E0167 “CHAR *”类型的参数与“const wchar_t *”类型的参数不兼容