0

私は次のコードhttp://pastebin.com/vLeD1GJmを持っていますが、これは問題なく動作しますが、増やすと次のようになります。

#define GPU_MAX_PW 100000000

に:

#define GPU_MAX_PW 1000000000

それから私は受け取ります:

frederico@zeus:~/Dropbox/coisas/projetos/delta_cuda$ optirun ./a
block size = 97657 grid 48828 grid 13951

unspecified launch failure in a.cu at line 447.. err number 4

私はこれを2GBのメモリを搭載したGTX675Mで実行しています。また、GPU_MAX_PWの2番目の定義は約1000000000×2÷1024÷1024 = 1907 MBになるため、メモリが不足していません。より多くのメモリを割り当てるだけなので、何が問題になる可能性がありますか?グリッドとブロックの構成が不可能になるのではないでしょうか。

エラーは次の行を指していることに注意してください。

HANDLE_ERROR(cudaMemcpy(gwords, gpuHashes, sizeof(unsigned short) * GPU_MAX_PW, cudaMemcpyDeviceToHost));
4

1 に答える 1

3

まず、サイズが間違って表示されています。このプログラムは、10,000,000 ではなく 10,000,000 で機能します (一方、1,000,000,000 ではなく 100,000,000 で機能すると言いました)。したがって、メモリサイズは問題ではなく、計算は間違った数値に基づいています。

calculate_grid_parameters がめちゃくちゃです。この関数の目的は、必要なスレッドの総数を指定する GPU_MAX_PW とブロックあたり 1024 スレッド (ハードコード) に基づいて、必要なブロック数とグリッド サイズを計算することです。block size = grid ... grid ... を出力する行には、実際に問題の手がかりがあります。GPU_MAX_PW が 100,000,000 の場合、この関数は 100,000,000/1024 = 97657 ブロックが必要であることを正しく計算します。ただし、グリッド ディメンションは正しく計算されません。グリッドの寸法 grid.x * grid.y は、必要なブロックの総数 (概算) と等しくなければなりません。しかし、この関数は、48828 の grid.x と 13951 の grid.y が必要であると判断しました。これら 2 つを乗算すると、681,199,428 が得られ、これは、必要な合計ブロック数 97657 よりもはるかに大きくなります。ここで、要求されたグリッド ディメンション 48828 (x) および 13951 (y) でカーネルを起動し、さらにブロックあたり 1024 スレッドを要求すると、そのカーネル起動で合計 697,548,214,272 スレッドを要求したことになります。まず第一に、これはあなたの意図ではありません。第二に、現時点では正確な理由は言えませんが、これは明らかにスレッドが多すぎるためです。この全体的なグリッド要求は、マシンのリソース制限を超えていると言えば十分です。

GPU_MAX_PW を 100,000,000 から 10,000,000 に下げると、グリッド計算が「適切」になることに注意してください。

block size = 9766 grid 9766 grid 1

起動失敗なし。

于 2012-11-01T03:02:59.740 に答える