共有メモリ型並列計算機上での強化学習 複数CPU
共有メモリ型並列計算機上での強化学習(2003/7/23)の続き。同期を取っていたせいで実行速度が遅いと思っていたので、同期を全く取らないように修正し、収束するまでの時間を測定した。結果、1スレッド 6秒、2スレッド 約50秒、3スレッド 約24秒・・・何なんだこの結果は。本当はスレッドを増やすたびに並列計算によって速くなると思ってたのに。
今使っている並列マシンは8CPU搭載しているのだが、本当にスレッドが複数CPU上で動いているのかと疑問に思ったのでtopコマンドで調べてみた。まずスレッドを1つだけ起動したとき、
実行ファイルa.outにCPUが99%割り当てられていて、どうやら使っているのはCPU2だとわかる。次、スレッドを2つ起動したとき、
スレッドを2つ起動しているのでa.outが2つある。だけどCPUを45%しか使っていないみたい。で、どのCPUが使われているのかと上の方を見てみると・・・なんだか全部使われているみたい。しかも少しずつ。スレッド2つだからCPUが2つだけ使われるんじゃないのかって疑問と各スレッドはCPUを45%しか使ってないのはなぜかという疑問が生じた。もしかしたらそんなものなのかと思って、各スレッドでfor文を回すだけのプログラムを作って、スレッドを2つ起動して調べてみた。結果、
各スレッドは99%使っている。しかも使っているCPUは4と6の2つだけ・・・両方ともスレッドを2つ起動しているのに何が違うんだ。スレッドの実行内容によって変わるのか。念のため強化学習の方でスレッドを3つ起動した場合も調べてみた。結果、
各スレッドは30%しか使ってないし、使われているCPUもばらばらだ。今日分かったことと疑問点。
- スレッドを増やすと遅くなるのは同期のせいじゃない(同期を使うとさらに遅くなるのは当然だけど)。
- 起動した各スレッドがCPUをフルに使っていないのはなぜか?
- スレッド2つ起動時、2つのCPUをフルに使わず、全部のCPUが少しずつ使われているのはなぜか?
topコマンドの結果をよく見てみると、スレッド1つのときは100%userに割り当てられているのに対し、スレッド2つのときはuserよりsystemの方への割り当てが大きい。各スレッドがCPUをフルに使えない原因はここらにありそう。プログラムの書き換えで解決できるのだろうか。出来なかったら・・・やばい。