当我使用下面的代码时,它显示了正确的值3345。
#include <iostream>
#include <cstdio>
__device__ int d_Array[1];
__global__ void foo(){
d_Array[0] = 3345;
}
int main()
{
foo<<<1,1>>>();
cudaDeviceSynchronize();
int h_Array[1];
cudaMemcpyFromSymbol(&h_Array, d_Array, sizeof(int));
std::cout << "values: " << h_Array[0] << std::endl;
}
但是如果我们用__device__ int *d_Array;
替换__device__ int d_Array[1];
这行代码,它会显示一个错误的值。为什么?
发布于 2016-04-14 01:08:02
问题出在内存分配上。在C++上(在主机上)尝试相同的操作,您将得到一个错误或意外的值。此外,您可以在内核之后调用cudaGetLastError()
来检查Cuda错误。在第一种情况下,一切都很好,结果是cudaSuccess
。在第二种情况下,出现cudaErrorLaunchFailure
错误。以下是对此错误的解释(来自cuda工具包文档):
“执行内核时设备上发生异常。常见原因包括取消引用无效的设备指针和访问超出界限的共享内存。在调用cudaThreadExit()之前,无法使用该设备。所有现有的设备内存分配都是无效的,如果程序要继续使用CUDA,则必须重新构造。”
发布于 2018-06-01 07:27:48
请注意,cudaMemcpyToSymbol还支持用于数组索引的offset参数
https://stackoverflow.com/questions/36601727
复制相似问题