プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

JAVAの並列処理を調べてみた

単純に別な処理をしながら、本処理に関係ないから次の処理にも移りたい、というぐらいのことでしかThreadを使ったことがなかった。
せっかく並列処理が大きな力を生む波シミュレートプログラムを作ったので、並列処理がどんな効果があるのか実際に調べてみた。
ちなみに、私の環境cpuはIntel Core 2 Duo3Ghz
(マルチコアなんてかつては時代の最先端だったんだがね。
今やi7に至っては物理的に4コア持ってるもんね〜。)
画面サイズは500*500の二万五千素子。(アプレットはその4分の1だからそんなに重たくないと思います。)
シングルスレッドで計算させると大体一回全体を計算させるだけでも28mili秒もかかる。
その時のCPUはこんな状況

大体全体として30%前後で動作していました。
一応二つとも動いているけど、第二コアの方が働いてるね。
次に処理を2スレッドに分けてみたところ、処理速度が平均15milisecと半分近くに減った。
JAVAはスレッド走らせるとちゃんと出来る限り別々のコアで動作させる様になってるらしい。
その時のCPUはこんな状況

両方ともしっかり働いてるね。
ちなみに、CPUは大体50%ぐらい使っていました。
最後に倍プッシュだ!ということで4スレッドで走らせてみると、処理速度は平均17milisecに。
一応シングルスレッドよりは早いが、スレッド処理の制御をしないといけないから遅くなったと言う事だろう。

2スレッドの時とcpuの反応はあまり差はない。
結論
JAVAではスレッドはちゃんと別々のコアに分散して処理してくれる。
コア数以上のスレッドを走らせると処理がコア数のスレッドよりも遅くなる。
今なら大体2コアはあるのが主流だから2スレッドで計算させると早くなれそうです。 java.lang.RuntimeのavailableProcessorsで利用可能なプロセッサ数が取得できました。これで分岐するのが良いですね。
 
そのうち気が向いたら一応JavaCL(JAVA版OpenCL)も使って試しては見ます。