我正在编写代码并使用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并考虑问题已解决后,我感到很不舒服。
答案 0 :(得分:2)
可能是类型大小不匹配:cudaPitchedPtr有几个类型为size_t的字段。因此,如果在主机端sizeof(size_t)为8字节,而在设备上这是4字节,则可能会出现问题。这也可以解释为什么定义另一个pitchedPtr解决了问题,因为分配了更多的内存。