切换到PTX文件后,cudaMemcpyToSymbol无法正常工作

时间:2012-09-27 04:39:55

标签: cuda gpu

使用funcname<<<<<<<<<<<<<< >>>

更改了代码以使用PTX文件。

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

这是.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_20,code = \“sm_20,compute_20 \” - use-local-env --cl-version 2010 -ccbin“C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ bin”
-I“C:\ Program Files \ NVIDIA GPU Computing Toolkit \ CUDA \ v4.2 \ include” -G --keep-dir“Debug”-maxrregcount = 32 --machine 32 -ptx -o“U:\ filterKernel.ptx”“U:\ filterKernel.cu”

正如我所说,只有改变是制作PTX文件并更改函数调用。另请注意,我得到的错误是变量是在const存储中还是在常规全局存储中。

提前感谢。

1 个答案:

答案 0 :(得分:1)

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

感谢harrism