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 を返します: 無効なシンボル
詳細: VS2010 で動作する Cuda 4.2、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 Computing Toolkit\CUDA\v4.2\include" -G -- keep-dir "Debug" -maxrregcount=32 --machine 32 -ptx -o "U:\filterKernel.ptx" "U:\filterKernel.cu"
先ほど言ったように、唯一の変更は PTX ファイルを作成し、関数呼び出しを変更することでした。また、変数が const ストアにあるか通常のグローバル ストアにあるかにかかわらず、エラーが発生することにも注意してください。
前もって感謝します。