メインコンテンツに移動

OpenMPI

あなたのMacBookAirで並列計算をする可能性は無いでしょう.しかし,MacOSXは計算クラスターと同じ系統のソフトウェアですから,あなたのMacBookAirにも並列計算システムをインストールしておけば,プログラム開発を手元で行うことができるようになります.

パッケージの利用方法

ここのopenmpiなんちゃらをインストール.使い方だと?あれ?どうするんだったっけ。多分Boostと類似した方法だろうな

再配布パッケージの作成

いくらなんでも古すぎるので, 作り直しておく.ええっと今は,OpenMPI v5.0.7くらいね.

ARM64ルド

ARM64ターミナルで実行する. 前回ビルドしたのが5年以上前なのか・・・うまくいくのかこれ. いやま,実際にノートPCで並列計算することはないので.形式上載せてないと, Linuxと同じソフトがビルドしにくいってだけなんで.

$ cd arm64
$ tar zxf ../openmpi-5.0.7.tar.bz2
$ cd openmpi-5.0.7
$ ./configure --prefix=/usr/local -disable-mpi-fortran
Open MPI configuration:
-----------------------
Version: 5.0.7
MPI Standard Version: 3.1
Build MPI C bindings: yes
Build MPI Fortran bindings: no
Build MPI Java bindings (experimental): no
Build Open SHMEM support: no (disabled)
Debug build: no
Platform file: (none)
Miscellaneous
-----------------------
Atomics: GCC built-in style atomics
Fault Tolerance support: mpi
HTML docs and man pages: installing packaged docs
hwloc: internal
libevent: internal
Open UCC: no
pmix: internal
PRRTE: internal
Threading Package: pthreads
Transports
-----------------------
Cisco usNIC: no
Cray uGNI (Gemini/Aries): no
Intel Omnipath (PSM2): no (not found)
Open UCX: no
OpenFabrics OFI Libfabric: no (not found)
Portals4: no (not found)
Shared memory/copy in+copy out: yes
Shared memory/Linux CMA: no
Shared memory/Linux KNEM: no
Shared memory/XPMEM: no
TCP: yes
Accelerators
-----------------------
CUDA support: no
ROCm support: no
OMPIO File Systems
-----------------------
DDN Infinite Memory Engine: no
Generic Unix FS: yes
IBM Spectrum Scale/GPFS: no (not found)
Lustre: no (not found)
PVFS2/OrangeFS: no
$ make all
$ find . -name \*dylib
./opal/.libs/libopen-pal.80.dylib
./opal/.libs/libopen-pal.dylib
./ompi/.libs/libmpi.40.dylib
./ompi/.libs/libmpi.dylib
./3rd-party/libevent-2.1.12-stable-ompi/.libs/libevent_pthreads-2.1.7.dylib
./3rd-party/libevent-2.1.12-stable-ompi/.libs/libevent_extra.dylib
./3rd-party/libevent-2.1.12-stable-ompi/.libs/libevent_extra-2.1.7.dylib
./3rd-party/libevent-2.1.12-stable-ompi/.libs/libevent.dylib
./3rd-party/libevent-2.1.12-stable-ompi/.libs/libevent-2.1.7.dylib
./3rd-party/libevent-2.1.12-stable-ompi/.libs/libevent_pthreads.dylib
./3rd-party/libevent-2.1.12-stable-ompi/.libs/libevent_core.dylib
./3rd-party/libevent-2.1.12-stable-ompi/.libs/libevent_core-2.1.7.dylib
./3rd-party/hwloc-2.7.1/hwloc/.libs/libhwloc.15.dylib
./3rd-party/hwloc-2.7.1/hwloc/.libs/libhwloc.dylib
./3rd-party/prrte/src/.libs/libprrte.dylib
./3rd-party/prrte/src/.libs/libprrte.3.dylib
./3rd-party/openpmix/src/.libs/libpmix.dylib
./3rd-party/openpmix/src/.libs/libpmix.2.dylib

X86ビルド

X86ターミナルで実行する.

$ cd x86_64
$ tar zxf ../openmpi-5.0.7.tar.bz2
$ cd openmpi-5.0.7
$ ./configure --prefix=/usr/local -disable-mpi-fortran $ make all
$ find . -name \*dylib
./opal/.libs/libopen-pal.80.dylib
./opal/.libs/libopen-pal.dylib
./ompi/.libs/libmpi.40.dylib
./ompi/.libs/libmpi.dylib
./3rd-party/libevent-2.1.12-stable-ompi/.libs/libevent_pthreads-2.1.7.dylib
./3rd-party/libevent-2.1.12-stable-ompi/.libs/libevent_extra.dylib
./3rd-party/libevent-2.1.12-stable-ompi/.libs/libevent_extra-2.1.7.dylib
./3rd-party/libevent-2.1.12-stable-ompi/.libs/libevent.dylib
./3rd-party/libevent-2.1.12-stable-ompi/.libs/libevent-2.1.7.dylib
./3rd-party/libevent-2.1.12-stable-ompi/.libs/libevent_pthreads.dylib
./3rd-party/libevent-2.1.12-stable-ompi/.libs/libevent_core.dylib
./3rd-party/libevent-2.1.12-stable-ompi/.libs/libevent_core-2.1.7.dylib
./3rd-party/hwloc-2.7.1/hwloc/.libs/libhwloc.15.dylib
./3rd-party/hwloc-2.7.1/hwloc/.libs/libhwloc.dylib
./3rd-party/prrte/src/.libs/libprrte.dylib
./3rd-party/prrte/src/.libs/libprrte.3.dylib
./3rd-party/openpmix/src/.libs/libpmix.dylib
./3rd-party/openpmix/src/.libs/libpmix.2.dylib

豚ビルド

豚リンゴを使う.

$ cd arm64
$ fswatch -x /usr/local >& files.log
$ sudo make install
$ kill %1
$ fswatch_analyze.sh -c _binary files.log
$ cd x86_64
$ fswatch -x /usr/local >& files.log
$ sudo make install
$ kill %1
$ fswatch_analyze.sh -c _binary files.log
$ cd ..
$ fatty_apple.sh arm64/_binary x86_64/_binary ←新型MacOS豚リンゴ. より美味しくなって再登場ってか
インストール先書き換えモードが発動しました
書き換え対象を特定
/usr/local/bin/plookup を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/hwloc-bind を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/mpirun を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/ompi_info を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/prte を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/hwloc-distrib を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/palloc を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/pattrs を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/hwloc-calc を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/hwloc-info を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/prun を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/pevent を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/prte_info を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/hwloc-patch を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/opal_wrapper を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/pmixcc を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/pquery を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/hwloc-diff を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/lstopo-no-graphics を書き換えたいな. x86_64 arm64 を作成.書き換え完了
/usr/local/bin/hwloc-ps を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/pps を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/pctrl を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/pmix_info を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/prted を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/hwloc-annotate を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/bin/pterm を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/lib/libopen-pal.80.dylib を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/lib/hwloc/hwloc_opencl.so を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/lib/libhwloc.15.dylib を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/lib/libevent_pthreads-2.1.7.dylib を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/lib/libevent_extra-2.1.7.dylib を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/lib/libpmix.2.dylib を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/lib/libevent_extra.a を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/lib/libevent.a を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/lib/libevent_core.a を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/lib/libevent-2.1.7.dylib を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/lib/libprrte.3.dylib を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/lib/libmpi.40.dylib を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/lib/pmix/pmix_mca_pcompress_zlib.so を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/lib/openmpi/libompi_dbg_msgq.so を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/lib/libevent_pthreads.a を書き換えたいな. x86_64 arm64 を作成. 書き換え完了
/usr/local/lib/libevent_core-2.1.7.dylib を書き換えたいな. x86_64 arm64 を作成. 書き換え完了

ううん.いちおうヘッダーファイルは入るんだが. /usr/local/lib/pmixの中身が変だ.

$ ls -l /usr/local/lib/pmix/
total 2928
-rwxr-xr-x  1 root  wheel     932  3  9  2021 mca_bfrops_v12.la
-rwxr-xr-x  1 root  wheel  116366  3  9  2021 mca_bfrops_v12.so
-rwxr-xr-x  1 root  wheel     932  3  9  2021 mca_bfrops_v20.la
-rwxr-xr-x  1 root  wheel  133982  3  9  2021 mca_bfrops_v20.so

おいおい,何を目指してPMIXビルドしたんだ?ここはLinuxじゃないぞ.だから・・・実際には動作しないなこのままじゃ.まあ動かすことはないけどね.

やっぱ,Linuxと同じでPMIXビルドしてから(MUNGEいらないのか?)OPENMPIビルドするべきでしょう.

再配布パッケージの作成方法

豚の時

豚で作っとかないと, AppleM1でXCodeできねえよ.だりーからロゼッタでな.

#-------------------------------
# [1] X86_64ターミナル
#-------------------------------
cd openmpi-4.0.0
make distclean
./configure --prefix=/usr/local CC=clang CXX=clang++ LDFLAGS=-Wl,-headerpad_max_install_names -disable-mpi-fortran
make all
mkdir x86_64
find . -name \*dylib -not -type l |while read file; do cp $file x86_64 ; done

これで, x86_64の内部に

lipo -info x86_64/*
Non-fat file: x86_64/libmca_common_monitoring.50.dylib is architecture: x86_64
Non-fat file: x86_64/libmca_common_ompio.41.dylib is architecture: x86_64
Non-fat file: x86_64/libmca_common_sm.40.dylib is architecture: x86_64
Non-fat file: x86_64/libmpi.40.dylib is architecture: x86_64
Non-fat file: x86_64/libompitrace.40.dylib is architecture: x86_64
Non-fat file: x86_64/libopen-pal.40.dylib is architecture: x86_64
Non-fat file: x86_64/libopen-rte.40.dylib is architecture: x86_64

ができた.

#------------------------------
# [2] ARM64ターミナル
#-------------------------------
cd openmpi-4.0.0
make distclean
./configure --prefix=/usr/local CC=clang CXX=clang++ LDFLAGS=-Wl,-headerpad_max_install_names -disable-mpi-fortran
make all
mkdir arm64
mv x86_64 ..
find . -name \*dylib -not -type l |while read file; do cp $file arm64 ; done
mv ../x86_64 .

これで, arm64の内部に

lipo -info arm64/*
Non-fat file: arm64/libmca_common_monitoring.50.dylib is architecture: arm64
Non-fat file: arm64/libmca_common_ompio.41.dylib is architecture: arm64
Non-fat file: arm64/libmca_common_sm.40.dylib is architecture: arm64
Non-fat file: arm64/libmpi.40.dylib is architecture: arm64
Non-fat file: arm64/libompitrace.40.dylib is architecture: arm64
Non-fat file: arm64/libopen-pal.40.dylib is architecture: arm64
Non-fat file: arm64/libopen-rte.40.dylib is architecture: arm64

ができた.

#------------------------------
# [2] ARM64ターミナル
#------------------------------
fswatch -x /usr/local/ > files.log &
sudo make install
mkdir universal
cd x86_64
for file in *
do
  lipo -create -arch x86_64 $file -arch arm64 ../arm64/$file -output ../universal/$file
done
cd ..
sudo cp universal/* /usr/local/lib
lipo -info universal/*
Architectures in the fat file: ../universal/libmca_common_monitoring.50.dylib are: x86_64 arm64
Architectures in the fat file: ../universal/libmca_common_ompio.41.dylib are: x86_64 arm64
Architectures in the fat file: ../universal/libmca_common_sm.40.dylib are: x86_64 arm64
Architectures in the fat file: ../universal/libmpi.40.dylib are: x86_64 arm64
Architectures in the fat file: ../universal/libompitrace.40.dylib are: x86_64 arm64
Architectures in the fat file: ../universal/libopen-pal.40.dylib are: x86_64 arm64
Architectures in the fat file: ../universal/libopen-rte.40.dylib are: x86_64 arm64
#
kill %1
fswatch_analyze.sh -c _binary files.log
pkgbuild --identifier openmpi --root _binary openmpi-4.0.0-osx11.2.pkg

Intelの時

MacOSのclangコンパイラは剛速ですから,10分程度しかかかりません.

  1. OpenMPIサイトからopenmpi-X.X.X.tar.gzをダウンロード
  2. tar xf ~/Downloads/openmpi-X.X.X.tar
  3. cd openmpi-X.X.X
  4. ./configure --prefix=/usr/local CC=clang CXX=clang++ LDFLAGS=-Wl,-headerpad_max_install_names -disable-mpi-fortran
    これで,gccではなくLLVMのコンパイラが設定される. Fortranは利用しないように設定される.
  5. make all
  6. fswatch -x /usr/local > openmpi.log &
  7. sudo make install
  8. kill %1

これで mpicxx とか mpif90 とかのコマンドが動作すればOK.

ついでなので、バイナリー配布パッケージを作る。

  1. インストールしたファイルのコピーを作成

    fswatch_analyze.sh  -c openmpi-binary < openmpi.log
    
  2. pkgbuild --identifier openmpi --root openmpi-binary openmpi-1.8.2-osx10.9.pkg

参考文献

  1. Installing OpenMPI on MacOSX