各スレッドの CUDA カーネル関数でローカル変数を宣言するとします。
float f = ...; // some calculations here
また、宣言された変数がコンパイラによってローカルメモリに配置されたとします(これは、私が知る限り、1つのスレッドでのみ表示されることを除いて、グローバルメモリと同じです)。私の質問は、それを読むときにアクセスf
が合体することですか?
各スレッドの CUDA カーネル関数でローカル変数を宣言するとします。
float f = ...; // some calculations here
また、宣言された変数がコンパイラによってローカルメモリに配置されたとします(これは、私が知る限り、1つのスレッドでのみ表示されることを除いて、グローバルメモリと同じです)。私の質問は、それを読むときにアクセスf
が合体することですか?
ローカル メモリ (または Fermi のスタック) がメモリ内にどのように配置されているかについての公式ドキュメントがあるとは思いませんが、マルチプロセッサの割り当てが「ストライプ化された」方法でアクセスされるため、分岐しないスレッドが同じwarp は、ローカル メモリへの合体アクセスを取得します。Fermi では、ローカル メモリもグローバル メモリと同じ L1/L2 アクセス メカニズムを使用してキャッシュされます。
CUDA カードには、ローカル変数に割り当てられたメモリがありません。すべてのローカル変数はレジスタに格納されます。多くの変数を持つ複雑なカーネルは、同時に実行できるスレッドの数を減らします。これは、低占有率と呼ばれる状態です。