Memoryのバンク衝突を回避するためにどのようなアドレッシングにすればよいのか、また、バンク衝突が起きた場合、どの程度のパフォーマンスの低下が見られるのか、実験してみました。カーネル部分だけ示します。もとは、SDKのtemplateサンプルとほぼ同じです。スレッド番号と共有メモリのアドレッシングがリニアになっているもの。SharedTest2は、スレッド番号と共有メモリのアドレッシングがリニアでなく、縦になっているものです。Test1では、同じワープに所属するスレッド0,1,2,3...が、メモリの0-3,4-7,8-11,12-15...をアクセスします。Test2では、同じワープに所属するスレッド0,1,2,3...が、メモリの0-3,64-67,128-131,192-195をアクセスします。このため、Test1のアクセスはすべて異なるバンクをアクセスしますが、Test2では全てが同じバンクをアクセスします。これを呼び出す側も一部抜粋しておきます。これは、SDKのtemplateサンプルをベースにしています。フルソースはそちらを参照して作ってください。度測定のために、配列を16*16*256のサイズにしています。これが小さいと、実行のオーバーヘッドなどのためか、実行時間にばらつきが生じてしまいます。呼び出し側でのスレッド同期の実行も必須です。この結果、Test1(衝突なし):0.0629[ms]Test2(衝突あり):0.249[ms]という結果になりました。実行速度に大きな差が生じていることが分かります。ちなみに、Emulationモードで実行するとバンク衝突を検出できるようになっていますが、これによってログを取ってみると、Test2においてのみバンク衝突が起きていることが確認できます。CUDA基本事項のページに戻るCUDAページのトップに戻る。