OpenMXという第一原理計算ソフトウェアがあります。Dockerの練習も兼ねてこのコードをインストールしてみました。Dockerで使うOSはUbuntu 20.04LTSです。Intel Macで動かしてみました。Dockerについては勉強中なので、間違っていることが多いかもしれませんが、とりあえずOpenMXは動きます。
コンパイラはIntelのOneAPIを使いました。OneAPIのインストール方法については
https://zenn.dev/hishinuma_t/articles/intel-oneapi_install
の記事を参考にさせていただきました。
注意点ですが、2コア以上で落ちます。これは、
https://qiita.com/cometscome_phys/items/7e6edc85f1e40cc33620
と同じ状況です。
何が問題なのかわかる方教えていただけると助かります。
[追記]
program main
implicit none
include 'mpif.h'
integer::PETOT,my_rank,ierr
call MPI_INIT(ierr)
write(*,*) "hello"
call mpi_finalize()
end program
というコードをmpiifort
でコンパイルしても2コアで落ちるので、下記はそもそもIntel MPIがちゃんと入っていないのかもしれません。
[さらに追記]
なんとかできる方法がわかりました。runをするところで、
docker run (中略) --shm-size=512m (後略)
みたいにする必要があるようです。あとで記事を整理します。
Dockerfile
今回使ったDockerfileを
https://github.com/cometscome/OpenMX_Docker
に置きました。ご自由にお使いください。もちろん自己責任で使用してください。動作の保証はできません。
説明
Dockerについての説明は割愛します。
まず、ディレクトリを作ります
mkdir openmx
cd openmx
このディレクトリの中に、makefile.patch
という名前のファイルを作り、
--- makefile 2019-12-02 14:12:58.000000000 +0900
+++ ../../../source/makefile 2021-10-17 16:44:25.000000000 +0900
@@ -5,10 +5,14 @@
# #
###################################################################
-MKLROOT = /opt/intel/mkl
-CC = mpicc -O3 -xHOST -ip -no-prec-div -qopenmp -I/opt/intel/mkl/include/fftw
-FC = mpif90 -O3 -xHOST -ip -no-prec-div -qopenmp
-LIB= -L${MKLROOT}/lib/intel64 -lmkl_scalapack_lp64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lmkl_blacs_openmpi_lp64 -lmpi_usempif08 -lmpi_usempi_ignore_tkr -lmpi_mpifh -liomp5 -lpthread -lm -ldl
+#MKLROOT = /opt/intel/mkl
+MKLROOT = /opt/intel/oneapi/mkl/latest
+CC = mpiicc -cc=icc -O3 -xHOST -ip -no-prec-div -qopenmp -lfftw3
+#CC = mpicc -O3 -xHOST -ip -no-prec-div -qopenmp -I/opt/intel/mkl/include/fftw
+FC = mpiifort -fc=ifort -O3 -xHOST -ip -no-prec-div -qopenmp -lfftw3
+#FC = mpif90 -O3 -xHOST -ip -no-prec-div -qopenmp
+LIB = -L${MKLROOT}/lib/intel64 -lmkl_scalapack_lp64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lmkl_blacs_intelmpi_lp64 -liomp5 -lpthread -lm -ldl -lifcore -lfftw3
+#LIB= -L${MKLROOT}/lib/intel64 -lmkl_scalapack_lp64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lmkl_blacs_openmpi_lp64 -lmpi_usempif08 -lmpi_usempi_ignore_tkr -lmpi_mpifh -liomp5 -lpthread -lm -ldl
#
# System B (Sekirei) at ISSP, Univ. of Tokyo
というものを作成して保存してください。
次に、Dockerfile
というファイル名のファイルを作成して、
FROM --platform=linux/x86_64 ubuntu:latest
RUN apt-get update
RUN apt-get install -y sudo
RUN useradd --uid 1001 --create-home --shell /bin/bash -G sudo,root openmxperson
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER openmxperson
WORKDIR /home/openmxperson
ADD . /home/openmxperson
RUN sudo apt update -y; sudo apt install -y wget gnupg \
&& cd /tmp \
&& sudo wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \
&& sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \
&& sudo rm GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \
&& echo "deb https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list \
&& sudo apt update -y \
&& sudo apt install intel-oneapi-compiler-fortran intel-oneapi-compiler-dpcpp-cpp-and-cpp-classic \
intel-oneapi-mkl intel-oneapi-mpi intel-oneapi-mpi-devel -y \
&& echo "source /opt/intel/oneapi/setvars.sh" | cat >> ~/.bashrc
RUN sudo apt install emacs gcc make patch -y \
&& sudo apt install libfftw3-3 libfftw3-dev libfftw3-doc -y \
&& sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/lib/x86_64-linux-gnu/libstdc++.so
RUN wget http://t-ozaki.issp.u-tokyo.ac.jp/openmx3.9.tar.gz \
&& wget http://www.openmx-square.org/bugfixed/20Feb11/patch3.9.2.tar.gz \
&& . /opt/intel/oneapi/setvars.sh \
&& tar -xvf openmx3.9.tar.gz \
&& cp ./patch3.9.2.tar.gz openmx3.9/source/ \
&& cd openmx3.9/source \
&& tar zxvf patch3.9.2.tar.gz \
&& mv kpoint.in ../work/ \
&& cp /home/openmxperson/makefile.patch . \
&& patch -u makefile < makefile.patch \
&& make all \
&& make install
ENV PATH=/home/openmxperson/openmx3.9/work/:$PATH
CMD ["bash"]
を書いてください。
これで、Dockerがインストールされていれば、
docker build --shm-size=2gb -t openmx .
でOpenMXが入ったコンテナイメージができるはずです。IntelのOneAPIコンパイラを入れたりしているために結構時間がかかります。なお、--shm-size=2gb
は重要で、これがないとrunした時に2並列以上で落ちます。
ここ
https://wiki.mpich.org/mpich/index.php/Frequently_Asked_Questions
に情報がありました。
これが終わったら、
docker run --shm-size=2gb --name oneopenmx -it openmxone /bin/bash
どのようにすれば実行できます。
Dockerについては他の記事を参照してください。
動作確認は
cd ../work
mpirun -np 1 openmx Methane.dat -nt 1 > met.std
cat met.std
で並列数を変更するなどしてちゃんと計算が動いているかどうかを見ればわかると思います。