複数のrtサーバプロセスを起動して試してましたが、 1つのrtサーバでもスレッドセーフな作りにしておけば、 複数のスレッドから繋げて使えるはず。
などと思って試してみると、色々とスレッドセーフになってなくて いっぱい修正が入ってしまいました。
とくに「値サーバ」。 例えば、複数のスレッドが値サーバに他のサーバの起動状況の情報を取りにいって、 起動してなかったらそのスレッドがサーバを起動しようとします。
ここで、複数のスレッドがほぼ同時に、あるサーバが起動してないと判定してしまって、 同じサーバをほぼ同時に複数起動してしまうという問題が起こってしまいました。
そこで「値サーバ」の中に、ちょっとした不可分なロックのしくみを追加して、 srvs.py の boot() からのサーバ起動確認処理で、使うようにしてみました。
$ mv rt_v37 rt_v38 $ cat v38.patch | ( cd rt_v38 ; patch -p1 ) $ cd rt_v38 $ make clean $ make
では、いつもの速度確認。
まず以前の通りrtサーバは2つ起動して使う設定のままで。
$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v38/objs_1_2_sc n=1 init_sec=5 div=2 : wh : 76800/76800(100.0%) : fin 18.49s
以前の v37 wh : 76800/76800(100.0%) : fin 15.49s v36 wh : 76800/76800(100.0%) : fin 15.13s v35 wh : 76800/76800(100.0%) : fin 16.16s v34 wh : 76800/76800(100.0%) : fin 38.47s v32 wh : 76800/76800(100.0%) : fin 26.84s v31 wh : 76800/76800(100.0%) : fin 40.50s v30 wh : 76800/76800(100.0%) : fin 38.39s v29 wh : 76800/76800(100.0%) : fin 1m 44.72s v28 wh : 76800/76800(100.0%) : fin 1m 18.06s v27 wh : 76800/76800(100.0%) : fin 1m 8.39s v26 wh : 76800/76800(100.0%) : fin 1m 6.02s
うーむ。
rt.py #names = [ 'srv.rt' ] * 2 この行のコメントアウトを外して names = [ 'srv.rt' ] * 2 にします。
これで、1つのrtサーバに2つのスレッドでから繋いでみます。
$ ./skill.sh $ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v38/objs_1_2_sc n=1 init_sec=5 div=2 : wh : 76800/76800(100.0%) : fin 15.44s
まぁあんまり変わらんですが、 この方式の方がちょっとだけの差で最速。
rt.py 例の箇所を #names = [ 'srv.rt' ] * 2 names = [ 'srv.rt', 'srv.rt', 'srv.rt-15', 'srv.rt-15' ]
2つのrtサーバに、それぞれ2つのスレッドをつないで、 合計4つのスレッドで走らせてみます。
$ ./skill.sh $ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v38/objs_1_2_sc n=1 init_sec=5 div=2 : wh : 76800/76800(100.0%) : fin 15.09s
これもまぁ誤差範囲かもですが、一応最速。
rt.py #names = [ 'srv.rt' ] * 2 names = [ 'srv.rt' ] * 4 + [ 'srv.rt-15' ] * 4
8スレッドではいかに?
$ ./skill.sh $ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v38/objs_1_2_sc n=1 init_sec=5 div=2 : wh : 76800/76800(100.0%) : fin 19.80s
まぁ2サーバ * 2スレッドで 4スレッドにしておきますかね。
rt.py names = [ 'srv.rt' ] * 2 + [ 'srv.rt-15' ] * 2
rtサーバの中にval.pyから取得したデータのキャッシュを持ったままになっていて、 違うデータの指定で cg.py を起動しても、前回取得したデータのまま処理が進む不具合がありました。
まぁデータを変更するたび ./skill.sh でサーバを落として何とかしてたわけですが、 さすがに面倒なので cg.py の起動時にrtサーバの中のデータのキャッシュをクリアできるようにしてみました。
では、伝統パターンで視点の動きをちょっと変えてみて試してみます。
$ ./cg.py eyep=[0,0,-20],[40,40,5],10 sec=20 data_name=rxs_check2 name=out_v38/rxs_check2_tst div=8 fps=15 : frm : 300/300(100.0%) : fin 3m 19.42s estimated 7.09 hour at 640*480 30fps
$ ./cg.py eyep=[0,0,-20],[40,40,5],10 sec=20 data_name=rxs_check2 name=out_v38/rxs_check2 : wh : 267968/307200(87.2%) : total 23.57s : rest 3.01s : 2018/05/17 06:11:42 wh : 307200/307200(100.0%) : fin 21.47s frm : 600/600(100.0%) : fin 5h 32m 53.51s $ ls -lt out_v38/ | head -rw-r--r-- 1 kondoh staff 2836688 5 17 06:11 rxs_check2.mp4 : 3MバイトOK