CUDAMEMCPITOSYMBOL在切换到PTX文件后不工作

CUDAMEMCPITOSYMBOL在切换到PTX文件后不工作,cuda,gpu,Cuda,Gpu,让GPU代码可以正常工作,就像使用funcname>调用的设备函数一样 更改代码以使用PTX文件 现在,所有调用cudaMemcpyToSymbol的行都返回错误代码:invalid symbol 以下是.cu文件的片段: { __device__ __constant__ void *devInFramePtrs [20]; __device__ __constant__ void *devOutFramePtrs [20]; __device__ __const

让GPU代码可以正常工作,就像使用funcname>调用的设备函数一样

更改代码以使用PTX文件

现在,所有调用cudaMemcpyToSymbol的行都返回错误代码:invalid symbol

以下是.cu文件的片段:

{

__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\u 20,代码=\“sm\u 20,compute\u 20\”--使用本地环境--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“Debug”-maxrregcount=32--machine 32-ptx-o“U:\filterKernel.ptx”“U:\filterKernel.cu”

正如我所说的,唯一的改变是生成PTX文件并更改函数调用。还要注意的是,无论变量是在常量存储中还是在常规全局存储中,我都会得到一个错误


提前谢谢。

哈里斯姆做对了。不推荐使用CUDAMEMCPITOSYMBOL。正确的方法是调用cuModuleGetGlobal以获取设备上的地址,然后将cudaMemcpy与该地址一起使用


谢谢harrism

在使用
cuModuleLoadData[Ex]
加载PTX后,您是否正在呼叫
cudaMemcpyToSymbol
?还要注意的是,CUDA 4.1之后不推荐使用字符串引用符号(您需要传递符号本身),因此您可能不应该这样做。在您的情况下,我相信您需要使用
cuModuleGetGlobal
来获取可以复制到的设备指针。我不确定您是否可以使用运行时API实现这一点。在PTX加载或JIT到上下文中之后,您可能需要使用驱动程序API直接从模块获取符号