参数与同一类型的参数不兼容
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”类型的参数不兼容