需要帮助诊断CUDAMEMCPITOSYMBOL错误吗

需要帮助诊断CUDAMEMCPITOSYMBOL错误吗,cuda,constants,gpu,Cuda,Constants,Gpu,我正在编写代码,并使用cudaMemcpyToSymbol将一些cudapitchedptr复制到(每个进程多个)GPU设备,以便方便地访问主机复制的内存。然而,我发现了一个非常奇怪的bug(我不太愿意这样称呼它,但我没有其他解释),我不知道如何有效地解决它。以下是我负责的代码部分: 因此,我从main.c中的main()调用gpu kernels.cu中的init_gpu()(init_gpu具有通常的extern“c”框架,但我删除了它,它不会影响下面的问题)。gpu_utilities.c

我正在编写代码,并使用
cudaMemcpyToSymbol
将一些
cudapitchedptr
复制到(每个进程多个)GPU设备,以便方便地访问主机复制的内存。然而,我发现了一个非常奇怪的bug(我不太愿意这样称呼它,但我没有其他解释),我不知道如何有效地解决它。以下是我负责的代码部分:

因此,我从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;
注释掉第二行后,以下CUDAMEMCPITOSYMBOL操作失败,错误代码为11:

cudaErrorCheck(cudaMemcpyToSymbol(rad_gpu, 
    &((*gpu_rad_parms)[n].dstPtr), sizeof(struct cudaPitchedPtr),
    cudaMemcpyHostToDevice), "init_gpu - rad_gpu - symbol");
但是,当我取消对test_pptr的注释(在我的代码中从未定义或使用过)时,此行不会抛出错误。测试类型_pptr似乎并不重要,只要它大于一个字符,我认为(这可能不是真的;我还没有完全描述这个问题)


可能感兴趣的是,没有这一行,rad_gpu是gpu decs.h中最后一个_常量_u声明。然而,这个错误对我来说仍然毫无意义。以前有没有人见过或听说过这个问题,并且有可靠的方法来解决它?我对声明test\u pptr并考虑问题已解决感到不安。

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

尝试用包含符号名称的字符串替换
cudaMemcpyToSymbol
调用的第一个参数(因此
cudaMemcpyToSymbol(“rad_gpu“,…)
),不幸的是,您的建议在我的案例中没有任何效果。我想cudapitchedptr应该始终作为内核参数传递。