Structure of ArraysとArray of Structs
コアレスアクセスしやすいデータ配置を選びます。
「Structure of ArraysとArray of Structs」はCoddyKit上の無料CUDA Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCUDA Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 CUDA Academyコースには全4レッスンが含まれています。
レコードを格納する2つの方法
各パーティクルがx、y、zを持つとします。それらをまとめて保持することも分けて保持することもでき、その選択によって各ワープのコアレッシングが変わります。
構造体の配列
自然なC++のレイアウトでは、各レコードのフィールドを隣り合わせに詰め込みます。これは構造体の配列(array of structs)で、AoSと略されることがよくあります。
struct Particle { float x, y, z; };
Particle p[N];AoSで分散する理由
ワープが各レコードからxだけを読み取る場合、xの値は12バイトずつ離れた位置にあります。この組み込みのストライドによって、取得する各ラインの大部分が無駄になります。
float xi = p[i].x; // x values are spaced by sizeof(Particle)配列の構造体
逆に、すべてのxの値、すべてのyの値、すべてのzの値をそれぞれまとめて格納します。これは配列の構造体(structure of arrays)、つまりSoAです。
float x[N];
float y[N];
float z[N];SoAでコアレッシングされる理由
これで32スレッドがxを読み取ると、連続した32個のfloatにアクセスできます。これは1本のアラインされたラインに収まり、各フィールドにつき整然としたトランザクション1回で済みます。
float xi = x[i]; // neighbors land in one lineフィールドアクセスの確認
カーネルがデータをどのように読み取るかを確認してください。多数のレコードにわたってスレッドが1つのフィールドを順に処理するなら、GPUではほぼ常にSoAが有利です。
AoSで問題ない場合
各スレッドが1つのレコードの全フィールドをまとめて使うなら、AoSではそれらが1本のラインに収まり、キャッシュにも適した状態を保てます。
スタイルではなく帯域幅
これは好みの問題ではありません。同じ計算でも、無駄なバイト数を削減するだけで、AoSからSoAに切り替えることで実際のスループットが何倍にもなることがあります。
中間的なハイブリッド方式
複数のレコードをグループ化し、各グループ内でフィールドを分けることもできます。このAoSoAレイアウトは、コアレッシングとキャッシュ局所性のバランスを取ります。
最適化の前に設計する
レイアウトはすべてのカーネルとコピー処理に関わるため、後から変更するのは困難です。アクセスパターンを考慮し、早い段階でSoAまたはAoSの形を選んでください。🧩
要点となる対応付け
GPUの経験則は、フィールドを配列に分け、各ワープが連続した範囲を読み取れるようにすることです。フィールド単位で処理するカーネルではSoAを優先してください。
クイックチェック
このアクセスをコアレッシングできるレイアウトを選んでください。
まとめ
AoSとSoAを比較しました。レコード全体を使う場合はフィールドをまとめ、ワープが一度に1つのフィールドを処理する場合は配列に分けます。🎉
AI チューターと学ぶ C++ — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 30
- レッスン
- 120
よくある質問
「Structure of ArraysとArray of Structs」レッスンは無料ですか?
はい。「Structure of ArraysとArray of Structs」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、CUDA Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 CUDA Academyコースには全4レッスンが含まれています。
「Structure of ArraysとArray of Structs」で何を学びますか?
コアレスアクセスしやすいデータ配置を選びます。 ブラウザで直接実行するハンズオンコードでCUDA Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
CUDA Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCUDA Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「Structure of ArraysとArray of Structs」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCUDA Academyレッスンでコードを書いて実行できますか?
はい。すべてのCUDA Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- メモリトランザクションとは何か
- コアレスアクセスとストライドアクセス
- Structure of ArraysとArray of Structs
- 実効帯域幅を測定する