2012-08-31 95 views
3

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

+0

尝试用包含符号名称的字符串替换'cudaMemcpyToSymbol'调用的第一个参数(所以'cudaMemcpyToSymbol(“rad_gpu”,......)') – talonmies

+0

不幸的是,您的建议没有任何影响我的情况 – user1639133

回答

2

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

+0

工程就像一个魅力。我猜cudaPitchedPtrs应该始终作为内核参数传递。 – user1639133