cuda - 需要帮助诊断 cudaMemcpyToSymbol 错误

标签 cuda constants gpu

我正在编写代码并使用 cudaMemcpyToSymbol 将一些 cudaPitchedPtrs 复制到(每个进程多个)GPU 设备,以便我可以方便地访问一些主机复制的内存。但是,我发现了一个非常奇怪的错误(我犹豫要不要这么调用它,但我没有其他解释),我不知道如何有效地解决它。这是我负责的代码部分:

所以从 main.c 中的 main() 我在 gpu_kernels.cu 中调用 init_gpu() (init_gpu 有通常的 extern "C" 框架,但我删除了这个并且它没有影响问题以下)。 gpu_utilities.cu 是唯一包含 gpu_decs.h 的文件(我将所有 CUDA 源代码内联到 gpu_kernels.cu 中)。

现在,这是 gpu_decs.h 的一段:

  __constant__ struct cudaPitchedPtr rad_gpu;

  //__constant__ struct cudaPitchedPtr test_pptr;

当第二行被注释掉时,以下 cudaMemcpyToSymbol 操作失败,错误代码为 11:

cudaErrorCheck(cudaMemcpyToSymbol(rad_gpu, 
    &((*gpu_rad_parms)[n].dstPtr), sizeof(struct cudaPitchedPtr),
    cudaMemcpyHostToDevice), "init_gpu - rad_gpu - symbol");

但是,当我取消注释 test_pptr(它从未在我的代码中的任何地方定义或使用)时,该行不会引发错误。 test_pptr 的类型似乎并不重要,只要它大于 char,我认为(这可能不是真的;我还没有完全描述问题)。

可能感兴趣的是,如果没有这一行,rad_gpu 是 gpu_decs.h 中最后一个 __constant__ 声明。但是,这个错误对我来说仍然毫无意义。有没有人以前见过或听说过这个问题,并且有可靠的方法来解决它?我对声明 test_pptr 并考虑问题已解决感到不安。

最佳答案

可能是类型大小不匹配:cudaPitchedPtr 有几个类型为 size_t 的字段。因此,如果在您的主机端 sizeof(size_t) 是 8 个字节,而在设备上是 4 个字节,您可能会遇到问题。这也可以解释为什么定义另一个 pitchedPtr 可以解决问题,因为分配了更多内存。

关于cuda - 需要帮助诊断 cudaMemcpyToSymbol 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12218873/

相关文章:

algorithm - GPU 上的高效全对集交集

python - 在Windows上安装tensorflow-gpu

c++ - 使用 CUDA Thrust 置换迭代器复制数组的特定元素

c++ - 静态常量 vs #define

cuda - 在 CUDA 中求解一般稀疏线性系统

C : Using char * const pointer

c++ - 为什么 `const T&` 不确定是 const?

cuda - CUDA 中统一虚拟寻址 (UVA) 的信息/示例

cuda - 是否可以通过 nvprof (或其他方法)看到内核执行是否发生在 Tensor Core 上?

python - 如何使用 Python 和 Numba 获取 GPU 中的 CUDA 内核数量?