11.4. ストライドとBank Conflict

注記

詳しくは「bank」(「バンク」)と「表:ワークアイテム・グループ関数」(表B.102「表:ワークアイテム・グループ関数」)を参照ください。

バンクコンフリクトについては、既に解説していますが読者には思い出して頂きたく思います。以下の図にある通りです。

図11.1 図:フル帯域

width=600

図11.2 図:半帯域

width=600

図11.3 図:1/16帯域(16 Bank Conflicts)

width=400

図11.4 図:フル帯域

width=400

重要

IntelのHD Graphics等のデバイスでは、ローカルメモリへの読み書きをするインターフェースのバスは64KBであり、16個のバンク(各4バイト、 32bit)があるので、概ね上記の図の関係は成立します。バンクの個数については各プロセッサの製造元のマニュアルやガイドに記載されているので、確認すると良いでしょう。

またIntelの「Optimization Guide」によるとワークグループの割り当てられる(べき)ローカルメモリは最低でも、4KBとされています。つまり32bitのデータを1024個以上とします。ローカルメモリのサイズはsubsliceにつき64KBのため、subsliceが2つある場合は、128KB、4つある場合は256KBのローカルメモリがあることになります。

AMDの一般的なプロセッサではCUにつき32KBのローカルメモリが附属します。

NVIDIAでは、16KBと48KBのいずれかを選択できるFermiを除外すると、一般的な構成は、CUにつき16KBとされています。

この差はアルゴリズムの設計に大きな差をもたらします。

図の通りBank Conflictの対応策にはストライドをうまく配置することで解決できます。前の項目で解説した通り、ローカルIDに応じてストライドを調整することによって(うまくいけば)バンクコンフリクトを減らすことができます。

Copyright 2018-2019, by Masaki Komatsu