2.18. Stalls(ストール)

メモリレイテンシの項目で、グローバルメモリやローカルメモリへのアクセスは非常に遅いと指摘したことを思い出してください。

ストールというのは、実行状態のスレッド(つまりワークアイテム)がメモリーの読み書きで待ち状態(または停止状態)に入ることです。

GPGPUでありがちな話ですが、パフォーマンスが遅いとストールのせいではないかと検討することがあります。しかし多くの場合、メーカーに問い合わせると、ストールが多いことはスレッドの使用率が高いので、ハードウェアスレッドがより効率的に動いてることを示しているといった回答が返ってきて、納得ができないという経験をお持ちの方は多くいるのではないかと思います。

ストールはメモリ(グローバル、ローカルメモリ、L1/L2キャッシュ等のイメージキャッシュ)にアクセスする限り必ず発生する事象であり、GPGPUは大量のスレッドをリクエストすることによって、ストールによるレイテンシを隠しているわけです。

(筆者が確認できる限り大半の)GPUは順不同(Out-of-order)で命令発行を行えるスケジューラーを持ちます。命令が待機中(ストール)となったワークアイテムは停止中とみなされ、他のキューに入っているワークアイテムを実行状態の命令として発行することで、重層な命令発行が可能となります。

GPUのスレッドはライトウェートかつ、Context Switching(コンテキストスウィッチ)等のオーバーヘッドがほとんどない、スレッド間の依存関係がないという特徴をいかして、大量のスレッドを投入することによって、ストールによる遅延を緩和していることになります。

もしストールがボトルネックという場合は、アクティブ(実行状態)なスレッドが少ないということを意味します。メモリのアクセス以前に、スケジューリングできるワークアイテム数が少ないというケースも考えられますし、それでも気になる方はストールの時間を短縮するためキャッシュやローカルメモリを使うといいでしょう。

Copyright 2018-2019, by Masaki Komatsu