我正在编写代码并使用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 并考虑问题已解决感到不舒服。