0

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 ストアにあるか通常のグローバル ストアにあるかにかかわらず、エラーが発生することにも注意してください。

前もって感謝します。

4

1 に答える 1

1

ハリズムはそれを正しくしました。cudaMemcpyToSymbol は非推奨です。正しい方法は、cuModuleGetGlobal を呼び出してデバイスのアドレスを取得し、そのアドレスで cudaMemcpy を使用することです。

ありがとうハリスム

于 2012-09-27T13:46:40.990 に答える