これが私の問題です。プロジェクトを高速化するために、カーネル内で生成された値を共有メモリに保存したいのですが、その値を保存するのに非常に長い時間がかかることがわかりました。「THIS LINE」を削除すると(以下のコードを参照)、つまり「THIS LINE」を削除すると、その値を保存するのが非常に高速になります(100倍のスピードアップ!)。
extern __shared__ int sh_try[];
__global__ void xxxKernel (...)
{
float v, e0, e1;
float t;
int count(0);
for (...)
{
v = fetchTexture();
e0 = fetchTexture();
e1 = fetchTexture();
t = someDeviceFunction(v, e0, e1);
if (t>0.0 && t < 1.0) <========== <THIS LINE>
count++;
}
sh_try[threadIdx.x] = count;
}
main()
{
sth..
START TIMING:
xxxKernel<<<gridDim.x, BlockDim.x, BlockDim.x*sizeof(int)>>> (...);
cudaDeviceSynchronize();
END TIMING.
sth...
}
この問題を解決するために、データを共有メモリに保存するだけのコードを単純化します。停止します。私が知っているように、共有メモリ。最も効率的なメモリです。登録以外に、この高いレイテンシーは正常なのか、それとも私が間違ったことをしたのだろうかと思います。アドバイスをください!!! よろしくお願いします!
トルディ
更新: 共有メモリをグローバルメモリに置き換えると、ほぼ同じ時間がかかり、「THIS LINE」がないと33ms、あると297msです。データをグローバルメモリに保存するのは正常ですか。共有メモリと同じ時間がかかります。それも「コンパイラの最適化」の一部ですか?
スタックオーバーフローに関する他の同様の問題も確認しました。つまり、データを計算しても保存しないのは無意味であるため、コンパイラの最適化が原因である可能性がある共有メモリにデータを保存するかどうかの間に大きな時間差があるため、コンパイラはそれらの無意味なコードを「削除」しただけです。
行がゲームを変更するのは仮説であるため、同じ理由を共有しているかどうかはわかりません- 「この行」、コメントすると、変数「カウント」がすべての反復で増加し、コメントを外すと、 t は意味があります。
何か案は?お願いします...