【发布时间】:2015-07-13 18:07:56
【问题描述】:
问题
我正在尝试将int 数组复制到设备的常量内存中,但我不断收到以下错误:
[ERROR] 'main.cu' 中的'invalid argument' (11) 在'386'行
代码
已经开发了很多代码,所以我将简化我所拥有的。
我在 main.cu 文件的顶部声明了一个设备 __constant__ 变量,在任何函数之外。
__device__ __constant__ int* dic;
我还有一个宿主变量flatDic,它在main() 内部按以下方式分配:
int* flatDic = (int *)malloc(num_codewords*(bSizeY*bSizeX)*sizeof(int));
然后我尝试将flatDic的内容复制到dic中,同样在main()中:
cudaMemcpyToSymbol(dic, flatDic, num_codewords*(bSizeY*bSizeX)*sizeof(int));
这个cudaMemcpyToSymbol() 称它为main.cu 的第386 行,就是上面提到的错误被抛出的地方。
我的尝试
这是我迄今为止尝试解决问题的方法:
我已经尝试了以下所有方法,总是返回相同的错误:
cudaMemcpyToSymbol(dic, &flatDic, num_codewords*(bSizeY*bSizeX)*sizeof(int));
cudaMemcpyToSymbol(dic, flatDic, num_codewords*(bSizeY*bSizeX)*sizeof(int));
cudaMemcpyToSymbol(dic, &flatDic, num_codewords*(bSizeY*bSizeX)*sizeof(int), 0, cudaMemcpyHostToDevice);
cudaMemcpyToSymbol(dic, flatDic, num_codewords*(bSizeY*bSizeX)*sizeof(int), 0, cudaMemcpyHostToDevice);
在调用cudaMemcpyToSymbol() 之前,我还尝试了cudaMalloc() dic 变量。 cudaMalloc() 中没有抛出错误,但 cudaMemcpyToSymbol() 错误仍然存在。
cudaMalloc((void **) &dic, num_codewords*(bSizeY*bSizeX)*sizeof(int));
我还通过网络、文档、论坛、示例等进行了广泛搜索,但均无济于事。
有人发现我的代码有什么问题吗?提前致谢。
【问题讨论】:
-
“我还通过网络、文档、论坛、示例等进行了广泛搜索,但均无济于事。” ...对于基本呼叫,请始终从 CUDA C 编程指南开始—— 1. 按
Ctrl + S并在浏览器/PDF 阅读器中输入您正在查看的呼叫。 2. 阅读任何适用的内容并查看指南的代码示例。 3.如果#2失败了,才去论坛潜水。在这种情况下,指南中的信息是正确的,直接来自 NVIDIA——只是一些关于如何处理 CUDA API 调用问题的未来建议。 -
我通常从参考指南开始,它以 HTML 格式提供。 Here's the CUDA 4.1 reference 谷歌的电话名称通常会出现这种情况。检查参考后,再检查编程指南。