2018pythonのthreadingを使いクーロン力の並列計算をするテスト以前行った、multiprocessingでのクーロン力並列計算に引き続き、threadingを使ったクーロン力の並列計算をテストする。計算条件はmultiprocessingの時と同じくcore数を4、計算粒子数を15^3個とした。結果、計算時間は14.36[sec]。multiprocessingでの計算は2.09[sec]であったため、大分時間がかかるというかシングルスレッドで計算していた時より時間がかかっている。threadingでは各threadがメモリを共有するために必要な情報を取得するためメモリアクセスする際に、排他ロック(GIL)が起きているのかな、と考えられる。試しにthread数を1にして実行してみると処理時間は6.92[sec]。thread化しない方が高速であった。2018pythonのmultiprocessingを使いクーロン力の並列計算をするテスト前回クーロン力計算部分の高速化を検討した。結果としてはシンプルに2重ループを使った計算。今回はこのクーロン力計算部分をmultiprocessingを使ったマルチプロセスによる並列化で高速化を試してみる。作成したコードが下記。結果は2.09[sec]。使用coreは4スレッド仕様なので、4プロセスでの処理を行った。前回の処理時間が約8秒であったのを考えると、理想どおり4分の1になる結果が得られた。前回イオントラップシミュレーションにて、分子動力学のopenGLを使った可視化を行った。この処理にかかるほぼすべての時間はクーロン力計算の箇所であり、各粒子同士の計算が必要となる。粒子数をN個とすると、計算量は1ステップあたりNC2回が必要となる。methodの様な高速化の方法も用いることができない。今回はこのイオントラップにおけるクーロン力計算の高速化を検討してみたいと思う。高速化対象のコードだけを抜き出してきたのが下記。"__main__":init_lattice()find_pair()上記コードの処理時間は手元の環境で約8.18[sec](10回実行した平均)このコードのfind_pair関数内のitertools箇所を下記の様にシンプルにforループを2重で処理する様書き替えた場合が下記。dz/(r*r*r)上記コードの処理時間は約7.93[sec](10回実行した平均)。itertoolsを使った方が高速になるのかなと思ってたけど、シンプルにforの2重ループの方が高速な結果になった。次に、forループ範囲をrangeコマンドで作っているのを、xrangeに変更してみる。rangeは内部でリストを生成してから要素参照するのに対して、xrangeはリストを作らず要素参照するらしい。dz/(r*r*r)上記コードで約7.89[sec](10回実行した平均)。気持ち速くなった程度だった。今回は粒子数15^3個で試しているが、数を増やしたら効果が出てくるかもしれない。最後、numpyを使ってみる。しても上手い使い方が思い浮かばず、forループの中の演算を無理矢理numpyを使った処理に書き替えた。(vvv/r3)上記コードで約78.46[sec](10回実行した平均)。多重ループの内周で、何度も実行されるような場所にnumpyの処理を配置するととんでもなく遅くなる。遅くなるとは思っていたが予想以上の重さ。78.46あと考えられる手法はスレッド化。これはまた今度試してみたいと思う。以前ここで試した単純な粒子の中に大きいサイズの粒子を放り込む。周囲から無数の粒子がぶつかりランダムに動くブラウン運動のような動きをみることができる。以前ここで試したmatplotlibを使った簡単な分子動力学計算の可視化処理ですが、描画が遅いのでOpenGLを使って書き直してみた。python用にはPyOpenGLのパッケージが用意されている。結果だがとても速い!■結果をgifアニメに落としたものが↓。gifアニメだと実際の描画より遅いので感動が伝わりにくい。2017matplotlibでランダムウォークランダムウォークをmatplotlibで表示してみた。各粒子の動作は乱数で上下左右に動くように設定。マシンが非力なせいか、粒子数を増やすとgif作成にやたら時間がかかる。dpi=50)実行した結果が下記。最近の投稿ある点(x,y)が多角形の内部にあるかどうかを判定するアルゴリズムボロノイ図を使いポリゴン図形の中に中心線を引くpolygonを形成する頂点列からボロノイ図を作成する頂点列で表すPolygonを構成する長いエッジに対しエッジ分割し、頂点を追加する。