Java用OpenMP「jomp」を試してみた
かなり古い(タイムスタンプが2000年)ので心配でしたが,そんなに高度な処理をするつもりはなく,単に簡単にforループが並列化されればいいので,試してみました.
まず,ダウンロード.
> wget http://www2.epcc.ed.ac.uk/computing/research_activities/jomp/download/jomp1.0b.jar > ls -l jomp1.0b.jar -rw-r--r-- 1 hoge hoge 175028 Sep 11 2000 jomp1.0b.jar
テストプログラムを書きます.拡張子が「.jomp」であって「.java」じゃないところに注意.
import jomp.runtime.*; public class jomp_test { public static void main(String arg[]){ int i; //omp parallel for shared(i) for(i=0;i<1000;++i){ if(i % 100==0) System.out.println("i="+i); } } }
ダウンロードしたjompのjarを通して,.jompファイルから.javaファイルを作ります.
> java -cp .:./jomp1.0b.jar jomp.compiler.Jomp jomp_test Jomp Version 1.0.beta. Compiling class jomp_test.... Parallel For Directive Encountered
作られた.javaファイルをビルドします.
> javac -cp ./jomp1.0b.jar jomp_test.java
スレッド数を指定せずに普通に実行してみます.
> java -cp .:./jomp1.0b.jar jomp_test i=0 i=100 i=200 i=300 i=400 i=500 i=600 i=700 i=800 i=900
スレッド数10で実行してみます.
> java -cp .:./jomp1.0b.jar -Djomp.threads=10 jomp_test i=0 i=100 i=500 i=400 i=800 i=200 i=300 i=600 i=700 i=900
なんか適当にばらけてて,うまくいっている気配です.
並列化されているか心配なので,sleepでも入れてみましょう.
import jomp.runtime.*; public class jomp_test { public static void main(String arg[]){ int i; //omp parallel for shared(i) for(i=0;i<1000;++i){ if(i % 100==0) System.out.println("i="+i); Thread.sleep(10); } } }
全く同じくコンパイルします.
> java -cp .:./jomp1.0b.jar jomp.compiler.Jomp jomp_test; javac -cp ./jomp1.0b.jar jomp_test.java Jomp Version 1.0.beta. Compiling class jomp_test.... Parallel For Directive Encountered
シングルスレッド実行.
> time java -cp .:./jomp1.0b.jar -Djomp.threads=1 jomp_test i=0 i=100 i=200 i=300 i=400 i=500 i=600 i=700 i=800 i=900 0.113u 0.052s 0:10.89 1.4% 79+946k 0+6io 0pf+0w
10秒かかった感じです(10ミリ秒×1000ループ=10秒).
次に10スレッド実行.
> time java -cp .:./jomp1.0b.jar -Djomp.threads=10 jomp_test i=0 i=600 i=800 i=500 i=300 i=100 i=400 i=700 i=200 i=900 0.123u 0.131s 0:01.27 19.6% 89+981k 0+6io 0pf+0w
1秒で終わった感じです.ちゃんと動いているようです.使えそうだったので,/usr/local/libにインストールしました.
> su # cp -pv jomp1.0b.jar /usr/local/lib/ jomp1.0b.jar -> /usr/local/lib/jomp1.0b.jar
しまった,portsもあったのか...
# cat /usr/ports/java/jomp/pkg-descr JOMP is a prototype OpenMP implementation for Java. WWW: http://www.epcc.ed.ac.uk/research/jomp/index_1.html