1. ホーム
  2. クーダ

[解決済み] バンクコンフリクトとは何ですか?(Cuda/OpenCLのプログラミングをする)

2022-03-04 07:34:35

質問

CUDAやOpenCLのプログラミングガイドを読んでいるのですが、バンクコンフリクトが何なのかがわかりません。この問題自体について詳しく説明することなく、ただ問題を解決する方法に飛び込んでいるような感じです。どなたか理解を助けていただけませんか?CUDA/OpenCLの文脈でのヘルプなのか、コンピュータサイエンスにおける一般的なバンクコンフリクトなのか、好みはありません。

どのように解決するのですか?

nvidia (amdも同様) gpusでは、ローカルメモリはメモリバンクに分割されています。各バンクは一度に1つのデータセットしかアドレスできないので、もしハーフワープが同じバンクから/へデータをロード/ストアしようとすると、アクセスを直列化しなければなりません(これはバンクコンフリクトです)。gt200の場合は16バンク(fermiは32バンク)、AMDの場合は16または32バンク(57xx以降は32、それ以下は16)で、これらは32ビットの粒度でインターリーブされています(つまり0-3バイトはバンク1、4-7はバンク2、...、64-69はバンク1、というようになります)。わかりやすくするために、基本的にはこのような構成になっています。

Bank    |      1      |      2      |      3      |...
Address |  0  1  2  3 |  4  5  6  7 |  8  9 10 11 |...
Address | 64 65 66 67 | 68 69 70 71 | 72 73 74 75 |...
...

そのため、ハーフワープ内の各スレッドが連続した32bitの値にアクセスする場合、バンクの競合は発生しません。このルール(すべてのスレッドが自分のバンクにアクセスしなければならない)の例外は、ブロードキャストです。 すべてのスレッドが同じアドレスにアクセスする場合、値は一度だけ読み込まれ、すべてのスレッドにブロードキャストされます(GT200では、ハーフワープのすべてのスレッドが同じアドレスにアクセスしなければなりませんが、フェルミとAMD GPUでは、同じ値にアクセスするスレッドの数にかかわらず、これを行うことができます)。