使用带有cudaMemcpyFromSymbol的指针声明全局设备数组

时间:2016-04-13 14:35:47

标签: cuda

当我使用以下代码时,它显示正确的值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;它显示错误的值。为什么呢?

2 个答案:

答案 0 :(得分:2)

问题出在内存分配上。在C ++(在主机上)尝试相同的事情,你会得到一个错误或意外的值。 此外,您可以检查在内核之后调用cudaGetLastError()的Cuda错误。在第一种情况下,一切都很好,结果是cudaSuccess。在第二种情况下,出现cudaErrorLaunchFailure错误。以下是此错误的解释(来自cuda toolkit文档):

“执行内核时设备发生异常。常见原因包括解除引用无效设备指针和访问超出范围的共享内存。在调用cudaThreadExit()之前,设备无法使用。所有现有设备内存分配无效如果程序要继续使用CUDA,则必须重建。“

答案 1 :(得分:0)

请注意,cudaMemcpyToSymbol还支持数组索引的偏移参数