#pragma unrollでループを展開する
ループのオーバーヘッドを減らし、ILPを引き出します。
「#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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 命令レベルの並列性
- #pragma unrollでループを展開する
- float4でベクトル化ロードを行う
- レジスタ圧力とスピル