CUDA Academy · レッスン

#pragma unrollでループを展開する

ループのオーバーヘッドを減らし、ILPを引き出します。

レッスン 2/413 ステップ

「#pragma unrollでループを展開する」はCoddyKit上の無料CUDA Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCUDA Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 CUDA Academyコースには全4レッスンが含まれています。

ループには隠れたコストがあります

ループの各反復では、カウンタ、比較、分岐のための処理が発生します。この管理処理をloop overheadと呼び、頻繁に実行される内部ループでは積み重なっていきます。

アンローリングの動作

Loop unrollingは、1回の反復で本体を複数回コピーし、ループの実行回数を減らします。カウントや分岐を減らしながら、同じ処理を行えます。

for (int i = 0; i < n; i += 2) {
    out[i]     = in[i]     * 2;
    out[i + 1] = in[i + 1] * 2;
}

コンパイラに任せます

CUDAには、コードを手作業でコピーせずに済むヒントがあります。ループの直前に#pragma unrollを置くと、コンパイラがアンローリングしてくれます。

#pragma unroll
for (int i = 0; i < 4; i++)
    sum += a[i];

具体的な係数を指定します

pragmaの後に数値を書くと、正確な回数を指定できます。#pragma unroll 4は、ループを一度に4反復分アンローリングします。

#pragma unroll 4
for (int i = 0; i < n; i++)
    acc += w[i] * x[i];

アンローリングを無効にします

完全なアンローリングによってコードが肥大化したり、レジスタを使いすぎたりすることがあります。#pragma unroll 1と書くと、コンパイラはループを記述どおりの状態に保ちます。

#pragma unroll 1
for (int i = 0; i < n; i++)
    process(i);

反復回数が定数だと有利です

アンローリングは、反復回数がコンパイル時にわかっている場合に最も効果的です。固定されたtrip countがあれば、コンパイラはループを直線的なコードに完全展開できます。

アンローリングでILPを引き出します

コピーされた反復同士には依存関係がないことがよくあります。そのため、スケジューラが重ねて実行できるindependentな命令が増え、追加コストなしでレイテンシを隠蔽できます。

分岐を減らし、高速な経路にします

ループをアンローリングすると、ハードウェアが終了conditionを確認する頻度が下がります。分岐が減ることで、命令の流れがより滑らかで予測しやすくなります。

レジスタとのトレードオフ

反復ごとに生存する値が増えると、registerの使用量も増えます。積極的なアンローリングによってレジスタがスピルし、occupancyが実際に低下することもあるため、常に効果があるとは限りません。

コードサイズも大きくなります

アンローリングしたコピーごとにカーネルが大きくなります。コードが大きいとinstruction cacheに負荷がかかるため、大きなループを完全にアンローリングすると実際のハードウェアでは逆効果になることがあります。

信頼する前に測定します

アンローリングは提案であって、魔法ではありません。選択した係数によって対象のカーネルとGPUが本当に高速化することを、必ずprofilerで確認してください。

簡単な確認

小さな固定ループをコンパイラに完全アンローリングさせたい場合、何と記述しますか。

まとめ:カウントを速度に変える

#pragma unrollによってループのオーバーヘッドを減らし、ILPを引き出せることを学びました。ただし、レジスタとコードサイズのコストに注意が必要です。各係数を測定して、確実に効果があるか確認してください。🧩

無料で開始

AI チューターと学ぶ C++ — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
30
レッスン
120

よくある質問

「#pragma unrollでループを展開する」レッスンは無料ですか?

はい。「#pragma unrollでループを展開する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、CUDA Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 CUDA Academyコースには全4レッスンが含まれています。

「#pragma unrollでループを展開する」で何を学びますか?

ループのオーバーヘッドを減らし、ILPを引き出します。 ブラウザで直接実行するハンズオンコードでCUDA Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

CUDA Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのCUDA Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「#pragma unrollでループを展開する」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このCUDA Academyレッスンでコードを書いて実行できますか?

はい。すべてのCUDA Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 命令レベルの並列性
  2. #pragma unrollでループを展開する
  3. float4でベクトル化ロードを行う
  4. レジスタ圧力とスピル
← CUDA Academyに戻る