当我使用以下代码时,它显示正确的值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;
它显示错误的值。为什么呢?
答案 0 :(得分:2)
问题出在内存分配上。在C ++(在主机上)尝试相同的事情,你会得到一个错误或意外的值。
此外,您可以检查在内核之后调用cudaGetLastError()
的Cuda错误。在第一种情况下,一切都很好,结果是cudaSuccess
。在第二种情况下,出现cudaErrorLaunchFailure
错误。以下是此错误的解释(来自cuda toolkit文档):
“执行内核时设备发生异常。常见原因包括解除引用无效设备指针和访问超出范围的共享内存。在调用cudaThreadExit()之前,设备无法使用。所有现有设备内存分配无效如果程序要继续使用CUDA,则必须重建。“
答案 1 :(得分:0)
请注意,cudaMemcpyToSymbol还支持数组索引的偏移参数