Sun Grid EngineとC言語プログラム

Sun Grid Engineとは、分散コンピューティング/
コンピュータ・クラスター環境におけるジョブ管理システム。
オープンソースだがサン・マイクロシステムズが援助しており、
サンから商用版の N1 Grid Engine が発売されている。
by Wikipedia先生

って言われてもわかりにくいですよね。
簡単に言うと大学等にある大型コンピューター群の使用率
を管理し、使用率の低いコンピューターに対しジョブ(プログラム)を
わりあてるソフトウェアのこと。
(私の説明もわかりにくいかも。。。(-_-#))
通常Sun Grid Engine(SGE)を通して投げられるプログラムは
スクリプト言語コンパイルのいらない言語(perlrubyなど)
によるものでなければならない。
なのでバイナリ(C, C++などのプログラムをコンパイルしたもの)
のプログラムをSGE経由で投げるには少し手間がかかる(-_-!)
方法として以下の二通りがある。

  1. qsub -b y (バイナリ名) と記述する
  2. シェルスクリプトを利用して、qsub (スクリプト名)

通常は2番目のシェルスクリプトが推奨されている。

私もC言語のプログラムをSGE経由で走らせようと思って
2番目の方法で試みてみた。
まずC言語のプログラム(temp.cpp)をSun Grid Engineで走らせる
ために、ファイルsamp.shに以下のようなシェルスクリプト
記述した。

#$ -S /bin/sh
/home/my_name/temp

ここでtempはtemp.cppをg++でコンパイルしたもの。
qsubを使って実行してみると

machineB{my_name}220: qsub -cwd samp.sh

なぜかエラーが出てしまう。エラーファイルを見てみると

ld.so.1: temp : fatal: libstdc++.so.6: open failed: No such file or directory
Killed

んー、私は基本的にこういう記述は意味不明なのですが、
なんとなくlibstdc++.so.6が見つからないようだ
他の人に相談してみたところ、qsubで環境変数も設定できるようなので
それを利用してみることに。
まずlddを使ってlibstdc++.so.6のパスを検索

machineB{my_name}230: ldd temp
libstdc++.so.6 => /usr/local/lib/libstdc++.so.6
libm.so.1 => /usr/lib/libm.so.1
libgcc_s.so.1 => /usr/local/lib/libgcc_s.so.1
libc.so.1 => /usr/lib/libc.so.1
libdl.so.1 => /usr/lib/libdl.so.1
/usr/platform/SUNW,Sun-Fire-15000/lib/libc_psr.so.1

libstdc++.so.6のパスは/usr/local/lib/なので
samp.shを以下のように編集し、

#$ -S /bin/sh
#$ -v LD_LIBRARY_PATH=/usr/local/lib/
/grid/share/my_name/temp

いざqsubを実行し、qstatでチェックすると

machineB{my_name}231: qsub -cwd samp.sh
machineB{my_name}232: qstat -u my_name
job-ID prior name user state submit/start at queue slots ja-task-ID

                                                                                                                                                                                                                                • -

4322619 0.50050 samp.sh my_name r XX/XX/XXXX 17:32:20 lab_share.q@machineA 1

うまくプログラムがSGE経由で走った(^o^)v