2019年4月8日月曜日

並列化、水冷化

 ループで処理をぶんぶん回す、というのはマルチコアのご時世ではあまり意味がないらしい。
 たとえば、Beelink S1はクアッドコアなのだけれど、システムモニターで見ていると、ぶんぶん、動いてくれていない。どうもひとつのCPUだけが酷使されているだけで全体としてはのんびりとしたものになるらしい。閉店ガラガラ。まぁ、当たり前かもしらんけど。
 しかし、ぼくはぶんぶんふり回したい。

 うーむ。それには処理を並列化するしかないかぁ。
 面倒だ。
 とりあえず、マルチプロセスで対応することにした。つまりプログラムを複数、動かして処理を並列化しよう、というわけ。そうすれば、CPUが閉店ガラガラなんてことにはならないだろう。たぶん。
 というわけではじめてrosスクリプトに取り組む。
 シェルスクリプトの感覚で途中までいじってふと、ああ、これはCommonLispなんだ、と気づく。
 なるほど。

 当たり前だけど、一気に10個とか、20個とか、プログラムを起動したらマシンがパンクする。
 ぶんぶんふり回すには同時に動かす数を制御する必要がある
 すると、処理のキューイングと起動したプログラムの死活監視がいる。うーん。そもそもどうやってプログラムが終わったことを検知すれば、いい? 昔、シェルプログラムで似たことをやったときには終了したときにファイルをつくるように仕込んだけど。
 それはそれで面倒なのでプログラムの起動部分をマルチスレッド化することにした。
 プログラムを同期起動してやれば、「プログラムの終了=スレッドの終了」になるはずなので、スレッドの状態を調べれば、なんとかなるのでは?
 ——なんとか、なった。

 軒並、90%ごえ。でも熱暴走しそうなのでとりあえず、Beelink S1を水冷化することにした。