前回までの整理
Easy-ISlispはver4.0で並列機能の追加を目指しています。手始めにコンカレントGCに入れ替えました。
Easy-ISLispは起動時に並列用のワーカースレッドとGCスレッドを起動しておきます。これらはキューに入れられて待機状態になります。
ワーカーは並列計算を担当します。計算の過程で空きセルが不足するとGCスレッドに起動するように通知を送ります。GCは通知を受け取るとコンカレントモードに入ります。どうしてもストップザワールドにしないといけない時間があるのでそのときにはコンカレントストップモードにはいります。この間セルの供給はストップします。スイープが終わるとストップモードは解除され通常動作になります。
ワーカースレッドはキューに入れられて待機させられます。5コアのマシンでは3つ、6コアのマシンでは5つが生成されます。plet、pcall、pexecの並列構文が実行された場合には分割されたS式がワーカーに送られeval計算が開始されます。plet,構文などはそれらのワーカーのeval計算が全部を終わるのを待って制御をメインスレッドに戻します。計算が終わったスレッドはキューに追加されます。
なんでインテルCPUよ、並列が遅い?
前回の投稿でたらいまわし計算を並列で行うとかえって遅くなることがわかりました。ところが不思議なことにarmを積んだラズパイ400では並列の効果がみられるのです。なぜ?
まだ推測段階ですが、どうもインテルのicoreシリーズはシングルスレッドでの高速性を重視しているようなのです。メインに比べるとサブのコアはそれほど計算速度は低速のようです。AMDのRYZENはインテルとは逆に並列性能の方を重視しているようです。科学技術技術計算にはRyzenの方が向いているという記事がみつかりました。並列プログラミングにおいてはRythenの方が向いているようです。
実証
中古のRyzenマシンを探してきましょうか。どこかに安いの転がってないかなぁ?
現在、ver3.40です。処理系はここに置いてあります。