hg log のグラフ化の例
前述のawk scriptで作成

祝日 / Permanent Vacation
styofa doing anything
No title available

#extradirty

Product Placement
Peter Solarz
Not today Justin
Game of Thrones Daily
d e v o n
todays bird

roma★
i don't do bad sauce passes

titsay
taylor price

No title available
trying on a metaphor

No title available
Misplaced Lens Cap

blake kathryn
he wasn't even looking at me and he found me
seen from Germany

seen from Thailand

seen from Guatemala

seen from Australia

seen from United States
seen from Germany
seen from Singapore
seen from United States
seen from Thailand
seen from Belgium

seen from United States

seen from United States

seen from United Kingdom
seen from United States

seen from United States

seen from United States

seen from Singapore

seen from United States
seen from Australia

seen from Malaysia
@tamachanishere
hg log のグラフ化の例
前述のawk scriptで作成
ちょっと昔の作業について調べていて、hg (mercurial) のログを新しいものほど下に並べつつブランチ間のコミットグラフを表示したかったんだけどどうもそういうことは無理そうで、諦めてログの解析のためだけに git に全部放り込んで見たんだけどやっぱり意図したことができなくて、諦めるしかないのかーってなったところで夜中に唐突に、hg の log を食わせると dot で graph 書く script を昔書いた記憶を思い出して、次の日頑張ってバックアップディスクを漁ったら出て来ました。
タイムスタンプ見ると作成日は2010年11月。それをさらに微修正して今回の目的は果たしたけど、次使う日はいつの日か。ここに公開しておきます。
#! /usr/bin/awk -f ## ## usage: hg log -r to:from | awk -f this.awk | dot -Tgif > this_graph.gif ## BEGIN{ HASPARENT=1; BRANCH=""; print "digraph hg_revisions {"; } $1=="changeset:"{ if (HASPARENT!=1) { printf(" \"%s\"->\"%s\"",$2,CSET) if (BRANCH!="") printf(" [ label = \"%s\"]", BRANCH); printf(";\n"); } CSET=$2; HASPARENT=0 BRANCH=""; } $1=="branch:"{ BRANCH=$2; } $1=="tag:"{ printf(" \"%s\" [ xlabel = \"%s\" ];\n", CSET, $2); } $1=="parent:"{ printf(" \"%s\"->\"%s\"",$2,CSET); if (BRANCH!="") printf(" [ label = \"%s\"]", BRANCH); printf(";\n"); HASPARENT=1 } END { print "}"; }
1/2倍でΔtを小さく切り直した時の履歴。なんどか速度が発散しかけては、その度にΔtを調節して問題を回避しているっぽい。問題は、最後までやらせた時にちゃんとトータルとして得をするのかということだが
時間刻みを細かくする際、1/4倍にしていたもの(緑)を1/2倍で置き換えてみたもの(紫)。2連続で調節することで、同じ時刻から同じ時間刻みで再開している。
しかし、その後すぐ時間刻みを大きく切り直して安定して計算ができているようである。
ふーん、という感じ
t=0.145付近でも時間刻み幅の切り直しが観測できました。
この場合、最大粒子速度が上昇を続け対応するvmaxに対する比が0.01を超えたところで時間刻み幅を切り直し。その後、最大の粒子速度は漸減して切り直し前程度に戻ったところでまたほぼ一定の速度になりました(計算している系が重力落下なのでそのぶん緩やかに加速しています)。
t=0.09付近でも速度が急に落ちる場所がありますが、こちらは時間刻みの調節とは関係ないようです。
時間刻みの調節アルゴリズムをもう少し意味のあるものに直したいのですが、その前に現行のものの動作を確認。
横軸が時刻tで、それに対応する時間刻みΔtが紫でplotしてあります。初期値が0.00001で、刻み幅を大きくしながら進行していってt=0.0002を過ぎたあたりで後戻りしています。ここで時間刻み幅が大きすぎたのでrollbackしてから細かな幅で進め直しています。このあとはしばらくこの刻み幅で進んでいます。
各ステップで最も速い粒子の速度をplotしたものが一番上の緑で、t=0.0002あたりまで速度が増え続け、時間刻み幅の調節後はほぼ同じ値を維持しています。
青のラインは許容できる最大速度に対する上の最速粒子速度の比で、今回の計算ではこれが0.01を越えると時間刻み幅を小さく切り直すことにしてあります。これにもrollbackしている様子が見えています。この許容できる最大速度はシステムの特徴長さとその時点での時間刻み幅で決まっており、1ステップの最大移動距離の特徴長さに対する比と捉えることもできます。
デモ計算:混合精度版DEM計算5(2倍スケール)
88200particles, 184820steps, 2871sec by nVidia Tesla K80 x 4
デモ計算:混合精度版DEM計算5
10800particles, 130775steps, 414sec by nVidia Tesla K80 x 4
デモ計算:混合精度版DEM計算4
39146particles, 357979steps, 1530sec by nVidia Tesla K80 x 4
ベンチマーク計算
Amazon AWS EC2のK80環境で、DEMシミュレーションのベンチマーク計算をやって見ました。使用したのはK80が4枚利用できるp2.8xlargeです。
K80: compute capability 3.7
13MP * 192cores/MP * 8device = 19968cores
結果
混合精度版
DEM計算4: 39146particles * 357979steps / 1530sec = 9,159,114 particles steps / sec
DEM計算5: 10800particles * 130775steps / 414sec = 3,411,521 particles steps / sec
DEM計算5(2倍スケール): 88200particles * 184820steps / 2871sec = 5,677,855 particles steps / sec
倍精度版
DEM計算4: 39675particles * 800290steps / 8180sec = 3,881,602 particles steps / sec
DEM計算5: 20938particles * 768666steps / 6692sec = 2,405,010 particles steps / sec
DEM計算5(2倍スケール): 170392particles * 1485194steps / 59265sec = 4,270,061 particles steps / sec
上の粒子数は移動する粒子のみの数で、全粒子数はもう少し多くなります。
混合精度版と倍精度版では、浮動小数点値の精度の他に近傍探索のアルゴリズムが異なります。混合精度版の方が効率は良い代わりに一つの大きさの粒子しか扱えません。
シミュレーションする時間は同じですが、時間刻みが可変なので全ステップ数が違ってきています。特に倍精度版ではその判定があまりよくなかったようで、かなりステップ数が多くなりシミュレーションにかかる実時間も大きなものとなっています。
PythonだけでDEMシミュレーション
先日実装した、メインループ内での時間刻みの調節をクラスを新しく作って追い出して、なんとかpythonだけでシミュレーション本体が回るようになりました。
そして長い間懸案だった初期配置の生成も、importさせるためのAoSな粒子クラス配列をpython上で構築できるように!
今までは、初期配置生成もC++のコード内にベタ書きで実装していたので、配置を弄るためだけに再コンパイルが必要だったのですが、これでscriptだけ弄っていくらでも計算流せるようになりました!
これ、ウェブインターフェイスとジョブキューイングをなんとかすれば、loginしないでジョブ流せるようにできないかな
ベンチマーク結果
GRID K520GTX 780TiTesla K80DEM4 (double)2.6M5.2M4.2MDEM5 (MixedPrecision)2.8M6.5M4.5M
単位:particles steps / sec
ベンチマーク計算
機能追加も一旦終わり、やっと安定して計算できるようになったのでベンチマーク計算してみました
実行環境
GRID K520 (compute capability 3)
number of multiprocessor: 8
number of cores / MP: 192
結果
混合精度版
DEM計算4:56340particles * 261620steps / 5381sec = 2,739,206 particles steps / sec
DEM計算5:16921particles * 184492steps / 1103sec = 2,830,271 particles steps / sec
倍精度版
DEM計算4:56869particles * 241612steps / 5371sec = 2,558,226 particles steps / sec
DEM計算5:27894particles * 461769steps / 4646sec = 2,772,403 particles steps / sec
混合精度版がちょっとだけ速いのは、デバイスからホストへのデータ転送が半分の時間になっている分ですね
粒径2種類、パラメータ改良版。別角度
粒径が2種類のDEM計算。パラメータ改良+可変時間刻み
パラメータリファイン版別角度
時間刻みの変更ルールをチューニングしたら発振は抑えられるようになった
えくせれんと!
でもトータル時間が延びてしまっているというのはどういうこと(笑)
上2枚、変更前。下2枚変更後。それぞれ1枚目が時間刻み幅Δt/s、2枚目がシミュレーションに要した現実時間。横軸は全てシミュレーション時間t/s