我正在编写代码并使用 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/