Erlangで数値解析(並列版)
昨日の続き。
http://d.hatena.ne.jp/yukichanko/20100624/1277377040
少し時間が余ったので、並列版を考えてみた。
しかし、これでイイのかわからない_| ̄|○
並列化したのは、電界/磁界の更新式の部分。
逐次版
並列化対称の関数。
calc_ey({Eps, Dt, Dx}, Ey, Hz) -> Diff_Hz = create_diff_list(Hz), % Hzの差分リストを作成 Cut_Ey = cut_both_end_element(Ey), % Eyの両端をカット [E - Dt / (Eps * Dx) * DH || {E, DH} <- lists:zip(Cut_Ey, Diff_Hz)]. % Ey更新式
並列版
よくわからんので、リスト内包の部分の計算を別プロセスを立ち上げて、メッセージパッシング。
% Ey計算本体 calc_ey(Const, Ey, Hz) -> Diff_Hz = create_diff_list(Hz), % Hzの差分リストを作成 Cut_Ey = cut_both_end_element(Ey), % Eyの両端をカット [send_calc_ey_message({E, DH}, Const) || {E, DH} <- lists:zip(Cut_Ey, Diff_Hz)]. % 個々のEy[i]の計算を別プロセスに投げる。 send_calc_ey_message(EH, Const) -> Pid = spawn(fdtd, calc_ey_main, []), Pid ! {self(), {EH, Const}}, receive {Pid, Msg} -> Msg end. % 個々のEy[i]の計算を実行して、親プロセスに戻す。 calc_ey_main() -> receive {From, {{E, DH}, {Eps, Dt, Dx}}} -> From ! {self(), E - Dt / (Eps * Dx) * DH} end.
一応これでいいと思うけど、そもそも計算負荷が軽すぎて、並列化してもほとんど意味ないやん、状態。
う〜ん、もっと別の題材でやらんとおんもろないなぁ。