5

私はしばらくの間、解決策を見つけることができないような問題に苦しんでいます。問題は、Visual Studio2008でNvidiaNsightを使用してCUDAコードをデバッグしようとすると、共有メモリを使用すると奇妙な結果が得られることです。

私のコードは次のとおりです。

template<typename T>
__device__
T integrate()
{
   extern __shared__ T s_test[]; // Dynamically allocated shared memory
   /**** Breakpoint (1) here ****/
   int index = threadIdx.x + threadIdx.y * blockDim.x; // Local index in block. Column major ordering
   if(index < 64 && blockIdx.x==0) { // Only work on a few values. Just testing
      s_test[index] = (T)index;
      /* Some other irelevant code here */
   }
   return v;
}

ブレークポイント1に到達し、Visual Studio Watchウィンドウ内の共有メモリを調べると、配列の最初の8つの値のみが変更され、他の値はnullのままになります。私は最初の64人全員がそうすることを期待します。 VisualStudioからウィンドウを見る

すべてのワープが同時に実行されないことと関係があるのではないかと思いました。そこで同期してみました。このコードを中に追加しましたintegrate()

template<typename T>
__device__
T integrate()
{
   /* Old code is still here */

   __syncthreads();
   /**** Breakpoint (2) here ****/
   if(index < 64 && blockIdx.x==0) {
      T tmp = s_test[index]; // Write to tmp variable so I can inspect it inside Nsight Watch window
      v = tmp + index; // Use `tmp` and `index` somehow so that the compiler doesn't optimize it out of existence
   }
return v;
}

しかし、問題はまだあります。さらに、tmp内の残りの値は、0VSが示しているウォッチウィンドウフォームとは異なります。 Nsightのウォッチウィンドウ

ステップオーバーするには多くのステップが必要な__syncthreads()ので、それに到達すると、ブレークポイント2にジャンプします。一体何が起こっているのでしょうか。


システム/起動構成に関する情報を編集します

システム

  • 名前Intel(R)Core(TM)2 Duo CPU E7300 @ 2.66GHz
  • アーキテクチャx86
  • 周波数2.666MHz
  • コア数2
  • ページサイズ4.096
  • 合計物理メモリ3.582,00MB
  • 使用可能な物理メモリ1.983,00MB
  • バージョン名Windows7Ultimate
  • バージョン番号6.1.7600

デバイスGeForce9500GT

  • ドライバーバージョン301.42
  • ドライバーモデルWDDM
  • CUDAデバイスインデックス0
  • GPUファミリーG96
  • 計算能力1.1
  • SMの数4
  • フレームバッファの物理サイズ(MB)512
  • フレームバッファ帯域幅(GB / s)16
  • フレームバッファバス幅(ビット)128
  • 専用のフレームバッファの場所
  • グラフィック時計(Mhz)812
  • メモリークロック(Mhz)500
  • プロセッサクロック(Mhz)1625
  • RAMタイプDDR2

IDE

  • Microsoft Visual Studio Team System 2008
  • NVIDIA Nsight Visual Studio Edition、バージョン2.2ビルド番号2.2.0.12255

コンパイラコマンド

1> "C:\ Program Files \ NVIDIA GPU Computing Toolkit \ CUDA \ v4.2 \ bin \ nvcc.exe" -G -gencode = arch = compute_10、code = \ "sm_10、compute_10 \" --machine 32 -ccbin "C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ bin" -D_NEXUS_DEBUG -g -D_DEBUG -Xcompiler "/ EHsc / W3 / nologo / Od / Zi / RTC1 / MDd" -I "inc" -I "C: \ Program Files \ NVIDIA GPU Computing Toolkit \ CUDA \ v4.2 \ include "-maxrregcount = 0 --compile -o" Debug / process_f2f.cu.obj "process_f2f.cu

構成を起動します。共有メモリのサイズとは問題ではないようです。私はいくつかのバージョンを試しました。私が最も協力してきたのは次のとおりです。

  • 共有メモリ2048バイト
  • グリッド/ブロックサイズ:{101、101、1}、{16、16、1}
4

1 に答える 1

1

値を割り当てた後に__syncthreads()を入れてみましたか?

template<typename T>
__device__
T integrate()
{
   extern __shared__ T s_test[]; // Dynamically allocated shared memory
   int index = threadIdx.x + threadIdx.y * blockDim.x; // Local index in block. Column major ordering
   if(index < 64 && blockIdx.x==0) { // Only work on a few values. Just testing
      s_test[index] = (T)index;
      /* Some other irelevant code here */
   }
   __syncthreads();
   /**** Breakpoint (1) here ****/
   return v;
}

そして、このブレークポイントで値を確認してみてください。

于 2015-11-17T17:03:40.000 に答える