事前評価

メニーコアに対応したプログラミングについて考えてみた。
手続き型パラダイムでは辛い。何故かというとシングルコアにしか対応していないから。現状の同期・排他モデルでは並列度の上昇に対応することが難しい、というより面倒くさい。さらにpthreadはあくまでもタスクを動かすためのもの、粒度が大きすぎてそのままでは使えない。
関数型パラダイムは有効。副作用なしであれば並列度の上昇にも問題なく対応できる。ただし、現状では並列計算の速度ではFortranに負けている。ライブラリやコンパイラの完成度に差があるのも大きいとは言え。
関数型パラダイムがこの壁を越える契機は「事前評価」にあるのではないか*1
従来の評価戦略の分類では、正格評価とは関数に引数を渡す際に完全に評価した値として渡すもの、非正格評価とは関数に引数を渡す際に評価前のメモとして渡すもの、といった扱いである。この場合の非正格評価とは「計算しないでも済むものは計算しない」という戦略として解釈される。
私の言う「事前評価」とは「計算できるものは片っ端から計算しておく」という戦略である。実装レベルで考えるならば、関数や式をすべてワーカーコアに投げておいて準備が整ったものから返していく。分岐があれば両方計算しておく。
ただ、これは原理上最速の評価戦略だが、一つ大きな欠点がある。メモリ周りのアーキテクチャとの整合が取れていないのだ。特にワーカーコアの終了をどのように検知するか、どのように値を受け取るか、が問題になる。簡単な計算ならメモリアクセスするよりも自分で実行する方が速いだろうし、単独コア計算速度とコア間通信速度の比に応じた割付が必要だろう。

*1:いや、「事前評価」という言葉はあまり聞かないのだけど。そもそも評価戦略という枠組みの話というよりは並列コンパイラ周りの投機実行をプログラミング言語に取り込もうという話だし。