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

标签 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; 它显示了错误的值。为什么?

最佳答案

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

“执行内核时设备上发生异常。常见原因包括取消引用无效的设备指针和访问越界共享内存。在调用 cudaThreadExit() 之前,无法使用设备。所有现有设备内存分配均无效如果程序要继续使用 CUDA,则必须重新构建。”

关于cuda - 使用带有 cudaMemcpyFromSymbol 的指针声明全局设备数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36601727/

相关文章:

matrix - 任意精度算术的 CUDA 实现

cuda - CUDA 内核中主机浮点常量的使用

algorithm - 您将如何在 CUDA 中实现此功能? (排序整数向量中的偏移量)

c++ - 如何使用模板函数和 CUDA

c++ - 带有 CUDA 的 OpenCV,非常清楚的错误消息,但无法弄清楚为什么?

c++ - 将并行 CUDA 程序转换为顺序运行

cuda - 结构和 Cuda C

cuda - CUFFT 错误处理

c++ - Cuda Runtime API 和驱动程序 API 问题

CUDA 代码的 C++ 设计