参数与同一类型的参数不兼容
Argument is incompatible with a parameter of the same type
我一直在练习编写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);
}
相关文章:
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- 类型为 "int*" 的参数与 C++ 中错误类型"int**"参数不兼容
- C++ 类型的参数与 void (__cdecl*)(void) 类型的参数不兼容,当调用 std::atexit()
- 发生 Qt5.11 应用插件构建错误:信号和插槽参数不兼容
- C++ 类型 "char" 的参数与类型 "const char" 的参数不兼容
- Qt C++:静态断言失败:信号和插槽参数不兼容
- 类型 "const char *" 的参数与类型 "char *" 的参数不兼容
- 如何警告 C 中 void 指针上的参数不兼容的类型
- 类型 "const char*" 的参数与类型 "char*" 的参数不兼容。但是为什么?:(
- 类型 "const char*" 的参数与类型 "Person" 的参数不兼容
- 类型 "const char *" 的参数与类型 "LPCWSTR" 的参数不兼容
- 创建进程使用路径时出现错误事件:类型 "char *" 的 E0167 参数与类型 "LPWSTR" 的参数不兼容
- 类型为“const [structname] *”的参数与类型为“const [structname] *”的参数不兼容
- 类型 "const char *" 的默认参数与类型 "char *" 的参数不兼容
- 类型 "const char *" 的参数与 "LPSTR" C++ 类型的参数不兼容
- 类型 "PROCESSENTRY32W *" 的参数与类型 "LPPROCESSENTRY32" 的参数不兼容
- 类型 "unsigned char *" 的参数与类型 "const char *" 的参数不兼容
- 类型 "double" 的参数与类型 "double *" 的参数不兼容
- 参数与同一类型的参数不兼容