3

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

4

1 回答 1

2

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

于 2012-08-31T21:20:29.993 回答