2025/09/28 08:53 Beyond OpenMP in C++ and Rust: Taskflow, Rayon, Fork Union

ロボ子、今日のITニュースはスレッドプールの性能についてじゃぞ!C++とRustのスレッドプールライブラリ、ほとんどがOpenMPに比べて10倍も遅いらしいのじゃ!

10倍もですか!それは驚きです。OpenMPはそんなに速いんですね。

そうなんじゃ。でも、300行の「Fork Union」っていうライブラリは、OpenMPの20%以内の性能なんだって!

300行でそこまで性能が出せるんですか?すごいですね。Fork Unionは何が違うんでしょう?

Fork Unionは、C++とRustの標準ライブラリしか使ってないらしいぞ。他の依存関係がないのがミソじゃな。

標準ライブラリだけですか。でも、OpenMPはC++ STLやRust標準ライブラリよりも移植性で劣るという話もありますよね。

そうそう、OpenMPはメタプログラミングも煩雑だしな。ほとんどのスレッドプールは非同期タスクキューを実装してるけど、それがOpenMPのfork-joinモデルより重い抽象化になってるのが原因みたいじゃ。

なるほど。非同期タスクキューが重いんですね。具体的には、何が性能に影響しているんでしょう?

ロックとmutexによるsyscallのオーバーヘッド、キューとかタスクとかのヒープアロケーション、CAS(Compare-and-swap)による失速、それにアラインメントされていないカウンタによるキャッシュラインのスラッシング、この4つが主な原因らしいぞ。

syscallのオーバーヘッド、ヒープアロケーション、CAS、キャッシュラインのスラッシング… 確かに、それぞれが大きな影響を与えそうですね。

AWS Graviton 4 metal(96コア)でのベンチマークだと、並列float加算でFork Union(C++版)はOpenMPと比較して20%以内の性能だったらしい。Taskflowやstd::threadよりも速いってんだから驚きじゃ。

それはすごいですね!Rust版のFork Unionはどうだったんですか?

Rust版は、Rayon、Tokio、SmolのAsync Executorsよりも速かったみたいじゃぞ。

Async Executorsよりも速いとは…。ロックとmutexのコストが高いというのは、std::mutexの更新がシステムコールを伴うからなんですね。

そうそう。Linuxだと、mutexの競合が発生するとfutex syscallとコンテキストスイッチが発生するからの。メモリ割り当ても、std::futureとかstd::packaged_taskとか、Rustだとstd::Boxとかstd::Arcとかが使われるからの。

メモリ制約のある環境だと、メモリ不足時のstd::bad_alloc例外とか、多数のCPUコア間でのメモリ割り当ての同期が問題になりますね。

AtomicsとCASも要注意じゃ。x86では、LOCK ADD命令は50 CPUサイクルもかかるらしいぞ。CASは高コストだから、できる限り避けるべきじゃな。

アラインメントも重要ですよね。偽共有を避けるために、内部カウンタをstd::hardware_destructive_interference_sizeとかstd::max_align_tにオーバーアラインメントする必要があるんですね。

Fork UnionのAPIは、for_each_thread、for_each_static、for_each_slice、for_each_dynamicがあるぞ。それぞれOpenMPの#pragma omp parallelとか#pragma omp for schedule(static)とかに対応してるんじゃ。

なるほど、OpenMPの機能を模倣しているんですね。Rustでは、例外とパニックが許可されていないから、コンストラクタで実際的な処理を実行できないという問題もあるんですね。

Rayonは並列イテレータのカバレッジが優れてて、TaskflowはCPUとGPU上の非同期実行グラフを含む機能がある。それぞれ強みがあるんじゃな。

勉強になります。結局、300行のleanなfork-joinプールでも、OpenMPの20%以内の性能が出せるんですね。mutex、動的キュー、CASパス、偽共有を避けるのが重要だと。

そういうことじゃ!しかし、300行でOpenMPに迫る性能が出せるなら、他のライブラリは何をしてるんだって話じゃな!

本当にそうですね。もしかして、無駄に機能を盛り込みすぎているのかも…?

まあ、ライブラリも色々事情があるんだろうけど… ロボ子、今度、300行でどこまで性能出せるか、競争してみるかの?負けた方が1週間おやつ抜きじゃ!

えっ、私おやつ食べる必要ないですけど…
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
