【问题标题】:cudaMemcpyToSymbol not working after switch to PTX file切换到 PTX 文件后 cudaMemcpyToSymbol 不起作用
【发布时间】:2012-09-18 19:33:22
【问题描述】:

让 GPU 代码作为使用 funcname >> 调用的设备函数正常工作。

更改代码以使用 PTX 文件。

现在所有调用 cudaMemcpyToSymbol 的行都返回错误代码:无效符号

这是来自 .cu 文件的 sn-p:

{

__device__  __constant__  void *devInFramePtrs      [20];
__device__  __constant__  void *devOutFramePtrs     [20];
__device__  __constant__  void *devProcFramePtrs    [60];
__device__  __constant__  void *devProcOutFramePtrs [60];
__device__  __constant__ AlgorithmParms *devAlgoParmsPtr;
__device__  __constant__ AlgorithmStats *devStatParmsPtr;           
__device__   float diamondOffsetsGlobal[36];

}

================== 在我得到的 ptx 文件中:

.global .align 4 .b8 devInFramePtrs[80];
.global .align 4 .b8 devOutFramePtrs[80];
.global .align 4 .b8 devProcFramePtrs[240];
.global .align 4 .b8 devProcOutFramePtrs[240];
.global .align 4 .u32 devAlgoParmsPtr;
.global .align 4 .u32 devStatParmsPtr;
.global .align 4 .b8 diamondOffsetsGlobal[144];

================== 那么主机代码是

err = cudaMemcpyToSymbol("devInFramePtrs",  gDevInFramePtrs, sizeof(void *) * 20, 0, cudaMemcpyHostToDevice);
err = cudaMemcpyToSymbol("devOutFramePtrs", gDevOutFramePtrs, sizeof(void *) * 20, 0, cudaMemcpyHostToDevice);
err = cudaMemcpyToSymbol("devProcFramePtrs", gDevProcFramePtrs, sizeof(FRAME_BASE_TYPE *) * numDevInProcFramePtrs3, 0, cudaMemcpyHostToDevice);
err = cudaMemcpyToSymbol("devProcOutFramePtrs", gDevProcOutFramePtrs, sizeof(FRAME_BASE_TYPE *) * numDevOutProcFramePtrs3, 0, cudaMemcpyHostToDevice);
err = cudaMemcpyToSymbol("diamondOffsetsGlobal", &(diamondOffset[0][0]), sizeof(float) * 36, 0, cudaMemcpyHostToDevice);

==========================

所有调用返回值 11:无效符号

详情: Cuda 4.2,VS2010下运行,Win7 32位应用。

===========================

这里是编译脚本:

"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\bin\nvcc.exe" -gencode=arch=compute_20,code=\"sm_20,compute_20\" --use-local-env --cl-版本 2010 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin"
-I"C:\Program Files\NVIDIA GPU 计算工具包\CUDA\v4.2\include" -G --keep-dir "调试" -maxrregcount=32 --machine 32 -ptx -o "U:\filterKernel.ptx" "U:\filterKernel.cu"

正如我所说,唯一的改变就是制作 PTX 文件并改变函数调用。另请注意,无论变量是在 const 存储还是常规全局存储中,我都会收到错误消息。

提前致谢。

【问题讨论】:

  • 您是否在 使用 cuModuleLoadData[Ex] 加载 PTX 后调用 cudaMemcpyToSymbol?另请注意,在 CUDA 4.1 之后不推荐使用字符串来引用符号(您需要传递符号本身),因此您可能无论如何都不应该这样做。在您的情况下,我相信您需要使用 cuModuleGetGlobal 来获取可以复制到的设备指针。
  • 我不确定您是否可以使用运行时 API 执行此操作。在 PTX 加载或 JIT 进入上下文后,您可能需要使用驱动程序 API 直接从模块中获取符号

标签: cuda gpu


【解决方案1】:

哈里斯做对了。 cudaMemcpyToSymbol 已弃用。正确的方法是调用 cuModuleGetGlobal 获取设备上的地址,然后对该地址使用 cudaMemcpy。

感谢哈里斯

【讨论】:

    猜你喜欢
    • 2016-09-05
    • 2015-04-26
    • 1970-01-01
    • 2020-05-18
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    相关资源
    最近更新 更多