@ledsun blog

無味の味は佳境に入らざればすなわち知れず

並列プログラムの作り方

咳さんがどこかですすめてたのを見て2018年に買った本です。 4年の熟成を経て、読んでみました。

原著は1990年発行なので、30年前の本です。 大学の教科書向けの本です。 教科書系の本によくあるように前半は理論というか概念の説明です。 なんでこういう構成なのか不思議でしたが、理論とか概念って30年経っても役立つ内容だからなんですね。 それとも(アンダース・エリクソンのいう)心的イメージを伝えようとしているのかもしれません。

並列のパラダイムを次の3つにわけて整理してます。

  1. 結果並列法(result parallelism)
  2. 専門家並列法(specialist parallelism)
  3. 手順並列法(agenda parallelism)

僕が今やりたいCPUバウンドな処理の並列化は1の結果並列法に入りそうです。 求める結果が分割できるので、結果を求める作業も分割した結果単位に分割して、並列化できます。

専門家並列法は、タスクの依存関係を整理して並列出来る処理を探す方法。 Conwayの法則 「organizations design systems that mirror their own communication structure.(組織は自らのコミュニケーション構造を反映したシステムを設計する)」っぽいなと思いました。 人を増やすだけでは並列数は増えなくて、組織にあったソフトウェアアーキテクチャにすると、実装タスクの並列数を増やせるのかな?とか考えました。

手順並列法は、並列に実行できる手順を定義する方法。 ActiveJobのジョブを実装する感じのようです。 分散データ構造が必要という話が出てきて、SidekiqでいうRedisのことだと理解しました。

書名の通り並列プログラムを作るときにどう考えて設計していけば良いのかが書かれてそうです。 30ページくらいしか読んでいません。

例としてn-体問題が出てきます。 三体に三体問題としてでてくるやつです。

てか、n-体問題って「力学モデル(Force-directed graph drawing)アルゴリズム」なのでは? 正確にはちがって、力学モデルはノードを良い感じに散らばらすためのアルゴリズムです。 力学モデルは繰り返し計算が必要で1値に収束しないで振動します。 これを1値に定めようとするとやたら難しくなるのがn-体問題に似ているように思いました。