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

Argument is incompatible with a parameter of the same type

本文关键字:参数 不兼容 类型      更新时间:2023-10-16

我一直在练习编写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);
}
相关文章: