0

このプログラムは、1GBのグローバルメモリを備えた1つのGPUで実行していました。次のエラーが発生しました。

Fatal error: cudaMemcpy1 error (unspecified launch failure at CheckDevice.cu:27)
*** FAILED - ABORTING
========= Out-of-range Shared or Local Address
=========     at 0x000006a8 in grid::SetSubgridMarker(grid*, grid*)
=========     by thread (0,0,0) in block (0,0,0)
=========     Device Frame:SetAllFlags_dev(param_t*, grid*) (SetAllFlags_dev(param_t*, grid*) : 0x108)
=========     Device Frame:SetAllFlags(param_t*, grid*) (SetAllFlags(param_t*, grid*) : 0x38)
=========     Saved host backtrace up to driver entry point at kernel launch time
=========     Host Frame:/usr/lib/libcuda.so (cuLaunchKernel + 0x3dc) [0xc9edc]
=========     Host Frame:/usr/local/cuda/lib64/libcudart.so.5.0 [0xa18a]
=========     Host Frame:/usr/local/cuda/lib64/libcudart.so.5.0 (cudaLaunch + 0x17f) [0x2f4cf]
=========     Host Frame:Transport [0xd395]
=========     Host Frame:Transport [0xd7bd]
=========     Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xed) [0x2176d]
=========     Host Frame:Transport [0x17bd]
=========
========= Program hit error 4 on CUDA API call to cudaMemcpy 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/libcuda.so [0x26a180]
=========     Host Frame:/usr/local/cuda/lib64/libcudart.so.5.0 (cudaMemcpy + 0x271) [0x348e1]
=========     Host Frame:Transport [0x2cea]
=========     Host Frame:Transport [0x3769]
=========     Host Frame:Transport [0xd7ee]
=========     Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xed) [0x2176d]
=========     Host Frame:Transport [0x17bd]
=========
========= Program hit error 4 on CUDA API call to cudaGetLastError 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/libcuda.so [0x26a180]
=========     Host Frame:/usr/local/cuda/lib64/libcudart.so.5.0 (cudaGetLastError + 0x1e6) [0x2a046]
=========     Host Frame:Transport [0x2cef]
=========     Host Frame:Transport [0x3769]
=========     Host Frame:Transport [0xd7ee]
=========     Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xed) [0x2176d]
=========     Host Frame:Transport [0x17bd]
=========
========= ERROR SUMMARY: 3 errors

不特定の起動失敗エラーの場合、関連するコード行はcudaMemcpy操作です。

cudaMemcpy(CurrentGrid, Grid_dev, sizeof(grid), cudaMemcpyDeviceToHost);
cudaCheckErrors("cudaMemcpy1 error");

次に、エラーメッセージに示されているように、それは言っOut-of-range Shared or Local Address at 0x000006a8 in grid::SetSubgridMarker(grid*, grid*)た。デバイスのグローバルメモリが不足しているためですか?デバイスのメモリ使用量を返す方法はありますか?

ソースコードでは、checkDevice.cuはgrid :: SetSubgridMarkerの後に実行され、checkDeviceはデバイスのメモリスペースをあまり消費しないので、cudaMemcpyを起動するスペースがないようにメモリgrid::SetSubgridMarkerを使い果たしていると推測しています(ただし、あまり自信がありません)。手術。助言がありますか?どうもありがとう!

4

2 に答える 2

7

不特定の起動の失敗は、cudaMemcpy操作が原因ではありません。これは、その操作の直前に発生したカーネル起動からの「残り」エラーです。

でコードを実行しているために報告されているメモリの範囲外アクセスが原因で、カーネルの起動が失敗している可能性がありますcuda-memcheck

SetSubGridMarker共有メモリまたはローカルメモリへの無効なアクセスがないか、カーネルコードを検査する必要があります。

これは、デバイスのグローバルメモリが不足していることを意味するものではありません。

このようなCの配列がある場合:

int C[5];

そして、私はこのような要素にアクセスしようとします:

int temp = C[6];  

これは範囲外のアクセスです。定義された変数ストレージの終わりを超えてアクセスしています。「メモリが不足している」という意味ではありません。

このようなことがあなたのSetSubGridMarkerコードで起こっています。あなたはそれが何であるかを見つけてそれを修正する必要があります。 cuda-memcheckまた、ブロック(0,0,0)のスレッド(0,0,0)がこの不正なアクセスを行っていることを通知することで、手がかりを与えています。このスレッドがローカルメモリまたは共有メモリに格納されているデータにどのようにインデックスを付けているかを注意深く調べることで、エラーを発見できるはずです。

ここで説明するような方法を使用して、障害を生成しているカーネルコードの特定の行を特定することもできますcuda-memcheck

于 2013-03-12T20:06:22.493 に答える
2

これは範囲外の例外であり、メモリ外の例外ではありません。これは、有効な(つまり、静的または動的に割り当てられた)メモリ範囲の一部ではないメモリにアクセスしていることを意味します。最も一般的な理由は、配列へのオフセットが大きすぎるか負になるか、ポインターが適切に初期化されていないことです。

メッセージに記載されているように、エラーは内部で発生しますgrid::SetSubgridMarker()。ただし、カーネル呼び出しは非同期であるため、次のCUDA呼び出しの前にエラーを報告することはできませんcudaMemcpy()

于 2013-03-12T20:06:12.947 に答える