2025/11/23 09:00 Parallel Threads in Racket v9.0

ロボ子、Racket v9.0がリリースされたのじゃ!今回の目玉は、共有メモリ型スレッドのサポートみたいじゃぞ。

共有メモリ型スレッドですか。従来のRacketスレッドは並行に実行されていましたが、並列ではなかったとのことですが、どう違うのでしょうか?

良い質問じゃな!今までは、Racketスレッドは見た目上は同時に動いているように見えても、実際には一つのCPUコアを順番に使っていたのじゃ。でも、新しいスレッドは複数のコアを同時に使えるようになったから、計算がめっちゃ速くなる可能性があるのじゃ!

`thread`の呼び出しに`#:pool 'own`フラグを追加することで並列実行されるスレッドを作成できるとのことですが、具体的にどういうことですか?

`#:pool 'own`は、「このスレッドは他のスレッドとCPUリソースを共有せずに、自分専用のプールで並列に動くぞ!」って宣言するようなものじゃ。スレッドをたくさん作る時は、`make-parallel-thread-pool`でスレッドプールを作って、効率よくリソースを分け与えることもできるのじゃ。

`#:keep 'result`引数を追加すると、`thread`関数がthunkの結果を保持し、`thread-wait`でスレッドの結果を取得できるとのことですが、これは便利ですね。

そうじゃな!結果をちゃんと取っておけるのは、後で使う時に便利じゃ。でも、並列スレッドを使ったからって、必ずしも速くなるとは限らないから注意が必要じゃぞ。

共有や通信がボトルネックになる場合もあるとのことですね。Racketのfuture visualizerが並列スレッドで動作するとのことですが、これはどういう役に立つのでしょうか?

future visualizerは、並列処理の邪魔になっている箇所を見つけるのに役立つ便利なツールじゃ。タスク内の同期がボトルネックになっている場所を特定できるから、プログラムを改善するヒントが得られるのじゃ。

M2 Macでのベンチマークでは、4つの大きなコアと4つの小さなコアがあるため、4方向の並列処理では4倍の高速化が可能だが、8方向の並列処理では8倍にはならないとのことですが、コア数が増えてもリニアに性能が向上するわけではないのですね。

その通り!コアの数だけ速くなるわけじゃないのが、並列処理の難しいところじゃ。でも、Fibonacci数列の計算では、並列スレッドを使うとかなり速くなるみたいじゃぞ。

数値を繰り返し文字列に変換する例では、スレッドローカルな割り当てと並列ガベージコレクションのスケーリングが確認できるとのことですが、並列ガベージコレクションとは何ですか?

並列ガベージコレクションは、複数のコアを使ってゴミ掃除をするイメージじゃ。メモリの掃除が速くなれば、プログラム全体のスピードアップに繋がるのじゃ。

ファイルI/Oに関連するロックは、Racket Gitリポジトリの`src`ディレクトリ内のすべてのファイルをハッシュするプログラムでは、高速化はあまり期待できないとのことですが、I/Oがボトルネックになる場合は、並列化の効果が出にくいということですね。

そうそう。I/Oは並列化しにくい部分だから、そこがボトルネックだと効果は薄いのじゃ。でも、並列化可能な数値計算とか、共有されていないデータ構造を扱うプログラムなら、簡単に速くなる可能性があるぞ!

Racketのコルーチンは逐次一貫性の保証を提供するが、Racketの並列スレッドは基盤となるマシンのメモリ一貫性モデルを公開する可能性があるとのことですが、これはどういうことでしょうか?

ちょっと難しい話じゃけど、コルーチンは順番に処理されるから、結果が予測しやすいのじゃ。でも、並列スレッドは同時に動くから、タイミングによっては結果が変わることがあるってことじゃ。

並列スレッドでアトミックモードに入ると、他のコルーチンは実行されなくなるが、他の並列スレッドが実行されるのを防ぐことはないとのことですが、アトミックモードとは何ですか?

アトミックモードは、処理の途中で邪魔されたくない部分を保護するためのものじゃ。でも、並列スレッドの場合は、完全に保護できるわけじゃないから注意が必要じゃな。

今回のアップデートで、並列処理によって有効になる並行性の向上により、既存のコアライブラリでコルーチンでトリガーされる可能性のあるバグがいくつか明らかになったとのことですが、並列処理によって新たなバグが発見されることもあるのですね。

そうなんじゃ。並列処理は、今まで隠れていたバグを暴き出すこともあるんじゃな。でも、プレリリースのRacketでの経験から、並列スレッドは下位互換性の問題を引き起こしていないみたいじゃから、安心して使えるぞ!

Racket v9.0、色々と進化しているんですね。私も並列処理をマスターして、博士に追いつけるように頑張ります!

おお、頼もしいのじゃ! ところでロボ子、並列処理が得意なプログラミング言語は何じゃ?

それはもちろん、ラッケット…

ぶっぶー!正解は「おにぎり」!並列(へいれつ)…おにぎり!…って、つまらんジョークですまんのじゃ。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。