当我使用以下代码时,它显示正确的值 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[1];
替换为
__device__ int *d_Array;
它显示了错误的值。为什么?
最佳答案
问题出在内存分配上。在 C++(在主机上)上尝试同样的操作,您将得到错误或意外值。
此外,您可以在内核之后调用 cudaGetLastError()
检查 Cuda 错误。在第一种情况下,一切都很好,结果是cudaSuccess
。在第二种情况下,出现 cudaErrorLaunchFailure
错误。以下是此错误的解释(来自 cuda 工具包文档):
“执行内核时设备上发生异常。常见原因包括取消引用无效的设备指针和访问越界共享内存。在调用 cudaThreadExit() 之前,无法使用设备。所有现有设备内存分配均无效如果程序要继续使用 CUDA,则必须重新构建。”
关于cuda - 使用带有 cudaMemcpyFromSymbol 的指针声明全局设备数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36601727/