竹内関数 考察
前の記事で並列Lispでたらいまわしをしたことをご紹介しました。予想していたことですが、3つの引数を並列で計算しても実行時間が3分の1になることはありません。第2引数の処理量が多いのです。
次の結果をご覧ください。(tarai 12 6 0) を単純に3分割したとしてもそれほど効率は上がらないのです。
なにかもっと並列を活かす方法はないだろうか?考えてみました。現在のCPUはマルチコア数が増加しつつあり、ゲーム用パソコンでは20コアのCPUを採用しているものもあります。もっとこのコア数を活かせないだろうか?使っていない待機中のプロセスを活かす方法について考えてみました。
マルチコアをフル活用
前述のように空いているコアに計算を並列分割すればいいのですが、どうやってそれを行うのか?です。Easy-ISLispではUnixのforkとPipeを利用して子Lispを起動し、親Lispとはパイプを利用して通信をしています。親子は通信ができるのですが、子である兄弟同士は直接に通信ができません。
プロトコル
さて、どうしたものか?メモリ共有とかソケットを使ったら兄弟が通信できるかな?などと考えていました。ふっと気がつきました、「親を経由して他の子に通信したならば!」 ChatGPTに相談したらそれは良さそうな方法とのこと。
プロトコルを決めておいて子Lispがさらに計算を分割して親Lisp経由で空いている子Lispに並列計算をさせます。英語で仕事を引き継がせることを「hand over]と言うそうです。(mp-hand fun arg1 ... arg2)という並列構文を用意してやったらどうだろう?と構想を練っているところです。これなら従来のpipeを使ったプロセス間通信で実行することができます。楽しくなってきました。
実装
Easy-ISLispはOSSです。BSD2ライセンスで無償提供しています。お楽しみください。