2012-09-27 68 views
0

讓GPU代碼正常工作,因爲設備函數使用funcname調用< < < >>>。cudaMemcpyToSymbol切換到PTX文件後不能正常工作

更改了代碼以使用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計算工具包\ 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文件和更改函數調用。另請注意,無論變量是在常量庫還是普通全局庫中,我都會收到錯誤。

在此先感謝。

+2

你以後調用'cudaMemcpyToSymbol' *加載與'cuModuleLoadData [例]'的PTX?還要注意,使用字符串引用符號(您需要傳遞符號本身)在CUDA 4.1之後已棄用,因此您可能不應該這樣做。在你的情況下,我相信你需要使用'cuModuleGetGlobal'來獲取你可以複製到的設備指針。 – harrism

+0

我不確定你可以使用運行時API來做到這一點。 PTX加載或JIT到上下文後,您可能需要使用驅動程序API直接從模塊中獲取符號 – talonmies

回答

1

哈里斯說得對。 cudaMemcpyToSymbol已棄用。正確的方法是調用cuModuleGetGlobal獲取設備上的地址,然後使用具有該地址的cudaMemcpy。

感謝harrism