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