我正在编写代码并使用cudaMemcpyToSymbol
将一些cudaPitchedPtrs
复制到(每个进程的多个GPU)设备,以便我可以方便地访问某些主机复制的内存。但是,我发现了一个非常奇怪的错误(我毫不犹豫地称之为,但我没有其他解释),我不知道如何有效解决问题。这里是我的代码的一部分负责:需要帮助诊断cudaMemcpyToSymbol错误
因此,从main.c main.c中调用init_gpu()在gpu_kernels.cu(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并考虑解决问题感到不舒服。
尝试用包含符号名称的字符串替换'cudaMemcpyToSymbol'调用的第一个参数(所以'cudaMemcpyToSymbol(“rad_gpu”,......)') – talonmies
不幸的是,您的建议没有任何影响我的情况 – user1639133