Intel oneAPI でのお仕事環境の構築
始めに
いつの頃からか定かではないのだが, Intel コンパイラなどの開発環境が Intel oneAPI として公開されていて, apt でインストールできる様になっている. …まあ, 例によって設定スクリプトに未だ bashism が残っていたりするのがアレだけれど, HPC 環境で Intel Compiler を使うことも多いので, テストに使う分には非常に助かるわけで.
導入と設定
この節は趣味の領域(飛ばして OK)
ビルドしたモノは /usr/local/intel
以下にインストールする予定なので
最低限
PATH=/usr/local/intel/bin:${PATH}
LD_LIBRARY_PATH=/usr/local/intel/lib:${LD_LIBRARY_APTH}
だけは設定しておくと良い.
導入
apt で導入します.
最近は deb822 形式で apt のソースを書いているので
以下のファイルを /etc/apt/sources.list.d/oneapi.sources
として
作成します.
Types: deb URIs:https://apt.repos.intel.com/oneapi Suites: all Components: main Arch: amd64 Signed-by: /usr/local/share/keyrings/intel.asc
続いて, 鍵を上記ファイルに置いておきます.
sudo wget https://repositories.intel.com/graphics/intel-graphics.key \ -O /usr/local/share/keyrings/intel.asc
インストールするパッケージは色々と選べるわけですが, 多過ぎて良くわからない. とりあえずは以下の通り:
% sudo apt-get update % sudo apt-get install cmake pkg-config build-essential % sudo apt-get install intel-hpckit intel-hpckit-runtime
何も考えずインストールしているので, かなり大きめです. コーヒーでも呑みながら待ちましょう. …ちなみに, WSL2 でも使えるらしいですね(プロファイラ回りの kernel module がどうなるのか知らんけど…).
なお, このパッケージは削除時に /usr/local/share/pkgconfig
を削除します. …雑なパッケージですねぇ.
設定
安直に環境設定するなら
% source /opt/intel/oneapi/setvars.sh
で良いです. しかしながら, 目的は計算もさることがならテストですから環境を切り替えたいと思うのが人情と言うものです.
setvars.sh
を眺めてみます.
- 453行目で
component_array=$(command ls "${script_root}"/*/*/env/vars.sh 2>/dev/null | awk 'NF')
として, 読み込む設定ファイルをリストアップしてます. - これを
uniq
なんかを使って整理して,source
してます.
というわけで, 実際にコンポーネントをリストアップしてみると….
% command ls /opt/intel/opneapi/*/*/env/vars.sh | awk 'NF' | grep latest | sort -u /opt/intel/oneapi/advisor/latest/env/vars.sh /opt/intel/oneapi/ccl/latest/env/vars.sh /opt/intel/oneapi/clck/latest/env/vars.sh /opt/intel/oneapi/compiler/latest/env/vars.sh /opt/intel/oneapi/dal/latest/env/vars.sh /opt/intel/oneapi/debugger/latest/env/vars.sh /opt/intel/oneapi/dev-utilities/latest/env/vars.sh /opt/intel/oneapi/dnnl/latest/env/vars.sh /opt/intel/oneapi/dpcpp-ct/latest/env/vars.sh /opt/intel/oneapi/dpl/latest/env/vars.sh /opt/intel/oneapi/inspector/latest/env/vars.sh /opt/intel/oneapi/intelpython/latest/env/vars.sh /opt/intel/oneapi/ipp/latest/env/vars.sh /opt/intel/oneapi/ippcp/latest/env/vars.sh /opt/intel/oneapi/itac/latest/env/vars.sh /opt/intel/oneapi/mkl/latest/env/vars.sh /opt/intel/oneapi/mpi/latest/env/vars.sh /opt/intel/oneapi/tbb/latest/env/vars.sh /opt/intel/oneapi/vpl/latest/env/vars.sh /opt/intel/oneapi/vtune/latest/env/vars.sh
…いや, まあ, こんなに使わんのだが
(Data Sicnese やら Deep Learning やらで Python 関連が入るんだなぁ…).
というわけで, 整理して切り替え可能にした zsh 関数はこんな感じかな?
intel コンパイラでビルドした諸々は /usr/local/intel
以下に置くことにしている
変数設定
読み込み
読み込んだ設定をクリア
公式で切り替え(というか, 汚した環境変数の消去)も提供してくれないモンかねぇ.
NetCDF
依存するモノが多くてなかなか大変.
圧縮に szip libaec, zlib, 仮想の I/O に HDF5, その上に NetCDF というソフトウェア構造
この順にインストールしていく.
szip -> libaec
BSD-2-Clause の szip の互換ソフトウェアとしてlibeacがリリースされている.
"Please be aware that SZIP compression has been replaced by AEC compression as of HDF5-1.10.7. AEC is the open source version of SZIP."
というわけで, libeac を導入する.
同梱されている INSTALL.md
に導入方法があるので,
基本はこれの通りに.
% sudo apt install gnulib % wget https://gitlab.dkrz.de/k202009/libaec/-/archive/v1.0.6/libaec-v1.0.6.tar.gz % tar xvf libaec-v1.0.6.tar.gz % cd libeac-v1.0.6 % gnulib-tool --import lib-symbol-visibility % autoreconf -iv % mkdir build % cd build % AR=xiar LD=xild \ CC=icc \ CFLAGS="-fPIC -O3 -xCORE-AVX2 -prec-div -fp-model precise -mcmodel=large" \ ../configure --prefix=/usr/local/intel % make % make check % make install
zlib
% wget https://zlib.net/zlib-1.2.11.tar.gz % tar xvf zlib-1.2.11.tar.gz % cd zlib-1.2.11 % mkdir build % cd build % AR=xiar LD=xild \ CC=icc \ CFLAGS="-fPIC -O3 -xCORE-AVX2 -prec-div -fp-model precise -mcmodel=large" \ ../configure --prefix=/usr/local/intel % make % make test % make install # /usr/local/intel/lib/libz.so* は消しても OK.
HDF5
あいかわらず, ダウンロードリンクは直接叩けないので おとなしく Web の URL をポチっとして落としてくる.
hdf5 v1.12 には以前の版と非互換の変更があるため, 互換APIを有効にしてビルドすることに. NetCDF側では対応済みみたいだけれど, これリリースされてるのかな….
必要なのは C API だけなので, 素のビルドで OK. ビルドもテストもかなり時間がかかるので, 適宜休憩挟みつつ進めると良いかと.
% tar xvf hdf5-1.12.1.tar.gz % cd hdf5-1.12.1 % mkdir build % cd build % AR=xiar LD=xild \ CXX=icpc \ FC=ifort \ CC=icc \ CFLAGS="-fPIC -O3 -xCORE-AVX2 -prec-div -fp-model precise -mcmodel=large -I/usr/local/intel/include" \ LIBS="-L/usr/local/intel/lib -laec" \ ../configure \ --prefix=/usr/local/intel \ --with-zlib=/usr/local/intel/lib \ --with-szlib=/usr/local/intel/lib \ --enable-hl \ --with-default-api-version=v110 % make % make check % make install % make check-install
NetCDF C
HDF5 の後に NetCDF C ライブラリを導入 (OPeNDAP を利用する気は無いので, curl は不要).
static でビルドする際には
HDF5 のインストール時に生成された C コンパイラの wrapper である
h5cc
の中身を見て, 設定されているライブラリの情報を適宜
LIBS
に指定すると良い.
libhdf5.settings
の中身も参考になるかと.
雑にやるなら CC
に h5cc
を指定する, という方法もあるが,
今後 nc-config
の出力を使って他のライブラリをビルドしたりすることを考えたりすると,
真面目(?)に configure を走らせた方が良い気がする.
% wget https://github.com/Unidata/netcdf-c/archive/refs/tags/v4.8.1.tar.gz \ -O netcdf-c-4.8.1.tar.gz % tar xvf netcdf-c-4.8.1.tar.gz % cd netcdf-c-4.8.1 % mkdir build % cd build % AR=xiar LD=xild \ CC=icc CFLAGS="-fPIC -O3 -xCORE-AVX2 -prec-div -fp-model precise -mcmodel=large -I/usr/local/intel/include" \ LIBS="-L/usr/local/intel/lib -lhdf5_hl -lhdf5 -lsz -lz-laec" \ ../configure \ --prefix=/usr/local/intel \ --disable-dap % make % make check % make install
NetCDF Fortran
C版同様に LIBS に必要なライブラリを列挙するのを忘れずに.
% wget https://github.com/Unidata/netcdf-fortran/archive/refs/tags/v4.5.3.tar.gz -O netcdf-fortran-4.5.3.tar.gz % tar xvf netcdf-fortran-4.5.3.tar.gz % cd netcdf-fortran-4.5.3 % mkdir build % cd build % AR=xiar LD=xild \ CC=icc \ CFLAGS="-fPIC -O3 -xCORE-AVX2 -prec-div -fp-model precise -mcmodel=large -I/usr/local/intel/include" \ FC=ifort FCFLAGS="-fPIC -O3 -xCORE-AVX2 -prec-div -fp-model precise -mcmodel=large -I/usr/local/intel/include" \ F77=ifort FFLAGS="-fPIC -O3 -xCORE-AVX2 -prec-div -fp-model precise -mcmodel=large -I/usr/local/intel/include" \ LIBS="-L/usr/local/intel/lib -lnetcdf -lhdf5_hl -lhdf5 -lsz -lz -laec" ../configure \ --prefix=/usr/local/intel \ --disable-dap % make % make check % make install
gtool5
gtool5: 20160613版
現在の「安定版」は configure を直す前の版なので,
一度 configure を走らせた後に手動で Config.mk
の修正が必要である.
% wget http://www.gfd-dennou.org/library/gtool/gtool5/gtool5_current.tgz % tar xvf gtool5_current.tgz % cd gtool5-20160613/ % AR=xiar LD=xild \ FC=mpiifort \ SYSFFLAGS="-fPIC -O3 -xCORE-AVX2 -prec-div -fp-model precise -mcmodel=large -I/usr/local/intel/include" \ ./configure \ --with-netcdff=/usr/local/stow/intel/lib/libnetcdff.so \ --with-netcdf=/usr/local/stow/intel/lib/libnetcdf.so \ --with-mpiexec=mpiexec # Config.mk の修正, 該当行は以下(修正後) SYSFFLAGS=-O3 -xHost -prec-div -fp-model precise -mcmodel=large -I/usr/local/intel/include -I/opt/intel/oneapi/mpi/2021.4.0//include -I/opt/intel/oneapi/mpi/20 21.4.0/include SYSLDFLAGS=-L/usr/local/intel/lib -L/opt/intel/oneapi/mpi/2021.4.0/lib/release -L/opt/intel/oneapi/mpi/2021.4.0/lib SYSLDLIBS=-lnetcdff -lnetcdf -lhdf5_hl -lhdf5 -lsz -lz -laec -lmpifort -lmpi -ldl -lrt -lpthread % make % make test % make test-mpi
そのままコレを使う場合は make install
しておく.
gtool5: GIT HEAD
configure
周りを全面的に書き替えているので
よくある変数を指定するだけで良い.
こちらを使う場合は make install
まで行なう.
SPML: v0.8.0
ISPACK: v1
% wget https://www.gfd-dennou.org/arch/ispack/ispack-1.0.4.tar.gz % tar xvf ispack-1.0.4.tar.gz % cd ispack-1.0.4 % vim Mkinclude # 以下を修正 FC = ifort FFLAGS = -fPIC -O3 -xCORE-AVX2 -qopenmp -prec-div -fp-model precise -align array64byte MPIFC = mpiifort MPIFFLAGS = $(FFLAGS) CC = mpiicc CFLAGS = -fPIC -O3 -xCORE-AVX2 -qopenmp -prec-div -fp-model precise CPPFLAGS = -DDIRECT -DFORMAT -DIEEE -DASCII -DLEN SSE = avx # NVCC = nvcc # NVCFLAGS = -arch=sm_20 -O3 % make % cp libisp.a /usr/local/intel/lib/
SPML: v0.8.0
リリースの tar.gz 生成に利用した環境が古い(libtool が古い)ので,
そのままでは intel compiler に渡す -rpath
のフラグが変になる.
configure
実行前に autoreconf -fi
で configure
を生成する必要がある.
% wget https://www.gfd-dennou.org/library/spmodel/spml_current.tar.gz % tar xvf spml_current.tar.gz % cd spml-0.8.0 % autoreconf -fi % AR=xiar LD=xild CPP="gcc -E" \ CC=mpiicc \ CFLAGS="-fPIC -O3 -xCORE-AVX2 -qopenmp -prec-div -fp-model precise -mcmodel=large -I/usr/local/intel/include" \ FC=mpiifort \ FCFLAGS="-fPIC -O3 -xCORE-AVX2 -qopenmp -prec-div -fp-model precise -mcmodel=large -align array64byte -I/usr/local/intel/include -I${MKLROOT}/include " \ LIBS="-L/usr/local/intel/lib -lnetcdff -lnetcdf -lhdf5_hl -lhdf5 -lsz -lz -laec -L${MKLROOT}/lib/intel64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lpthread -lifcore" \ ../configure \ --prefix=/usr/local/intel \ --with-ispack=/usr/local/intel/lib/libisp.a \ --with-netcdff=/usr/local/intel/lib/libnetcdff.a \ --with-netcdf=/usr/local/intel/lib/libnetcdf.a \ --with-gtool5=/usr/local/intel/lib/libgtool.a \ --with-mpifc=mpiifort \ --with-mpiexec=mpiexec \ --with-lapack=${MKLROOT}/lib/intel64/libmkl_lapack95_lp64.a % make % make test
これを使うなら make install
する.