Epiphany SDK + OpenMPI

ParallellaにはEpiphanyが乗っていますので、これを使わない手はありません。OpenMPIでCPU単位での分散を行い、そこからさらにEpiphanyに処理を投げる形になります。

今回は動作確認ということでルーズに行きましょう。~/tests/mpi/hello.cをベースに、手抜きなスケルトンを用意します。

#include <mpi.h>

int main(int argc, char *argv[]) {
  MPI_Init(&argc, &argv);

  // ここにロジックを埋め込む

  MPI_Finalize();
  return 0;
}

ロジック部分は~/epiphany-examples/apps/hello-world/を参考にします。というかコピペします。上記スケルトンのロジック部分に、src/hello_world.cのmain()の中身をそのままコピペです。Epiphanyにロードさせるアプリはsrc/e_hello_world.cをそのまま流用します。

ソースが用意できたらコンパイルします。一々コマンドラインを編集するのも面倒なので、以下のようなMakefileを用意しました (行頭の空白はタブ文字です)。

ESDK=${EPIPHANY_HOME}
ELIBS="-L${ESDK}/tools/host/lib"
EINCS="-I${ESDK}/tools/host/include"
ELDF=${ESDK}/bsps/current/fast.ldf

all:
 mpicc main.c -o main.elf ${EINCS} ${ELIBS} -le-hal -le-loader -lpthread
 e-gcc -T ${ELDF} e_hello_world.c -o e_hello_world.elf -le-lib
 e-objcopy --srec-forceS3 --output-target srec e_hello_world.elf e_hello_world.srec

clean:
 rm -f main.elf e_main.elf e_main.srec

それではコンパイルしてみましょう。

$ make clean
$ make

無事にコンパイルできました。ビルドしたファイルを同じディレクトリ構成でparallella02にもコピーします。それではさっそく実行してみましょう。

$ mpirun -np 4 -host parallella01,parallella02 ./main.elf
...
./main.elf: error while loading shared libraries: libe-hal.so: cannot open shared object file: No such file or directory
...

エラーになりました。これは、ssh経由でコマンドが実行される際にデフォルトで環境変数が読み込まれない設定(仕様)になっているのが原因です。parallella02側のsshの設定を変更しましょう。

$ sudo vi /etc/ssh/sshd_config
...
PermitUserEnvironment yes
$ sudo /etc/init.d/ssh restart
$ vi ~/.ssh/environment
PATH=/opt/adapteva/esdk/tools/e-gnu/bin:/opt/adapteva/esdk/tools/host/bin:/opt/openmpi/bin:/bin:/usr/bin
LD_LIBRARY_PATH=/opt/adapteva/esdk/tools/host/bin:/opt/openmpi/bin:
EPIPHANY_HDF=/opt/adapteva/esdk/bsps/current/platform.hdf

~/.ssh/environmentファイルではシェルは実行されませんので、変数等は一切利用できません。編集が済んだらparallella01側からsshでprintenvしてみて、設定が反映されていることを確認します。

$ ssh parallella02 printenv
...
PATH=/opt/adapteva/esdk/tools/e-gnu/bin:/opt/adapteva/esdk/tools/host/bin:/opt/openmpi/bin:/bin:/usr/bin
LD_LIBRARY_PATH=/opt/adapteva/esdk/tools/host/bin:/opt/openmpi/bin:
EPIPHANY_HDF=/opt/adapteva/esdk/bsps/current/platform.hdf

問題なさそうですね。それでは再度実行してみましょう。

$ runmpi -np 4 -host parallella01,parallella02 ./main.elf
 0: Message from eCore 0x8ca ( 3, 2): "Hello World from core 0x8ca!"
 0: Message from eCore 0x8ca ( 3, 2): "Hello World from core 0x8ca!"
 0: Message from eCore 0x8ca ( 3, 2): "Hello World from core 0x8ca!"
 0: Message from eCore 0x8ca ( 3, 2): "Hello World from core 0x8ca!"
...

今度はうまく動いたようです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です