Relion3からCPUの拡張命令(AVX2/AVX512)を活用したCPU-acceleration版が作れる。
GNU gcc(4.9以上)でも作れるようだが、市販品の インテルコンパイラーならもっと早く演算するバイナリーを作れるとの事。
ここでは intel コンパイラー の「インテル(R) Parallel Studio XE 2019 Update 4 Cluster Edition for Linux」で作ってみた
注意
GPUカードを使わないバイナリが用意されます。CPUのみで計算します。ですがGPUで計算できるジョブはGPUで計算したほうが早いです。
ならなんで用意するの?となりますが、もともとGPUを使わない計算ジョブが早くなるので。
使えるのはどのCPU? †
relionのドキュメントにはintel CPUの拡張命令AVX2とAVX512向けのコンパイル例が掲載されている。
AVX2は、Haswell世代、第4世代Intel Coreプロセッサに装備されている(Pentium, Celeronを除く)
AVX512は、Skylake世代、第6世代Intel CoreプロセッサのCore i9(7900Xとか)から装備されている。
表にするとこんな感じ
マイクロ アーキテクチャ | Haswell | Skylake | Sunny Cove |
世代 | Haswell 第4世代Core | Broadwell 第5世代Core | Skylake 第6世代Core | Kaby Lake 第7世代Core | Coffee Lake 第8世代Core | Coffee Lake Refresh 第9世代Core | Cascade Lake | Ice Lake 第10世代Core |
Core i7 Extreme Core i7 Core i5 Core i3 | Xeon E3(v3) E5(v3) | i7 i5 i3 | Xeon D E3(v4) E5(v4) | i7 i5 i3 | i9X(99xx) i7X(98xx) i9X(79xx) i7X(78xx) | Xeon E3(v5) | Xeon Bronze Silver Gold Platinum | i7 i5 i3 | Xeon E3(v6) | i9 i7 i5 i3 | Xeon E | i9 i7 i5 i3 | i9x(109xx) Xeon W-2200 Xeon W-3200 | i9 i7 i5 i3 |
AVX2 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
AVX512 | x | x | x | x | x | ○ | x | ○ | x | x | x | x | x | ○ | x |
準備 †
インテルコンパイラーの導入方法は省略
インストール項目は
インテル(R) C++ コンパイラー 19.0 Update 4
インテル(R) C++ コンパイラー
インテル(R) Fortran コンパイラー 19.0 Update 4
インテル(R) Fortran コンパイラー
インテル(R) MKL 2019 Update 4 (C/C++)
インテル(R) MKL コア・ライブラリー (C/C++)
クラスターサポート (C/C++)
インテル(R) TBB スレッド化サポート
GNU* C/C++ コンパイラー・サポート
インテル(R) TBB 2019 Update 6
インテル(R) TBB
インテル(R) MPI ライブラリー 2019 Update 4
インテル(R) MPI ライブラリー、インテル(R) 64
コンパイル †
インストール先を「/apps/relion-3.1.0.icc」とします。
[root@c ~]# cd /apps/src
[root@c src]# git clone https://github.com/3dem/relion
[root@c src]# cd relion
[root@c relion]# git checkout -b v3.1 remotes/origin/ver3.1
[root@c relion]# git branch
master
* v3.1
(インテルコンパイル環境を準備)
[root@c relion]# source /opt/intel/compilers_and_libraries/linux/bin/compilervars.sh intel64
[root@c relion]#
[root@c relion]# mkdir b && cd b
[root@c b]# CC=mpiicc CXX=mpiicpc cmake -DCUDA=OFF -DCudaTexture=OFF -DALTCPU=ON -DMKLFFT=ON \
-DGUI=ON -DCMAKE_C_FLAGS="-O3 -ip -xCORE-AVX2 -restrict " \
-DCMAKE_INSTALL_PREFIX=/apps/relion-3.1.0.icc ..
(Sandy Bridge,Ivy BridgeなCPUに対応するには)
「-xCORE-AVX2」を「-xAVX」とする
[root@c b]# make ; make install
AVXはSandy Bridgeから利用可能
AVX2はHaswellから利用可能
実行1 †
予めiccの実行環境を構築します。
単純には下記のようにintel cc側で提供されているスクリプトを実行します。
source /opt/intel/compilers_and_libraries/linux/bin/compilervars.sh intel64
その後に
を実行します。そうしないとインテルさんのライブラリが読めないので起動しません。
実行2 †
あるいはEnvironmentModules/sampleに示したように icc 向けの Modulefile を用意します。
「relion/3.1.0.icc」とかのファイル名で
#%Module1.0
#%Module1.0
conflict eman2
module load icc # ここら辺に組み込む
set RELION /apps/relion-3.1.0
prepend-path PATH $RELION/bin
setenv RELION_QSUB_COMMAND qsub
setenv RELION_MPIRUN mpirun
setenv RELION_QSUB_TEMPLATE $RELION/bin/qsub.sh
setenv RELION_QUEUE_NAME s3
setenv RELION_QUEUE_USE false
setenv RELION_CTFFIND_EXECUTABLE /apps/ctffind-4.1.14/bin/ctffind
setenv RELION_MOTIONCOR2_EXECUTABLE /apps/MotionCor2/MotionCor2_1.3.2-Cuda102
setenv RELION_GCTF_EXECUTABLE /apps/Gctf/Gctf-v1.06_sm_30_cu8.0_x86_64
setenv RELION_RESMAP_EXECUTABLE /apps/ResMap/ResMap-1.1.4-linux64
setenv RELION_PDFVIEWER_EXECUTABLE evince
setenv RELION_UNBLUR_EXECUTABLE /apps/unblur_1.0.2/bin/unblur_openmp_7_17_15.exe
setenv RELION_SUMMOVIE_EXECUTABLE /apps/summovie_1.0.2/bin/sum_movie_openmp_7_17_15.exe
そうすると「module load relion/3.1.0.icc」の実行とともにicc環境も用意される
メモ †
GPUによるAccelerationとCPU(AVX2,AVX512)によるそれを比べるとGPUを搭載したほうがパフォーマンスはでる。
ただGPUによるAccelerationは目下Class2D,Class3D,refineら限定される。
解析のほとんどはこれに時間を要しているためGPUの恩恵は高い。
Class2D,Class3D,refine以外の処理にこのicc版relionを使うと効率がいいのか若干上向く
iccでcudaを利用できるバイナリを作ってみる †
大抵は GCC を使ってcudaを利用できるバイナリを作りますRelion/GPU
ここでは、GPU-accelerationを icc で作ってみます。 単にチャレンジ?
CC=mpiicc CXX=mpiicpc cmake -DCUDA=ON -DCudaTexture=ON -DALTCPU=OFF -DMKLFFT=ON \
-DGUI=ON -DCMAKE_INSTALL_PREFIX=/apps/relion-3.1.0.cuda.icc ..
make
make install
これで一応は作れるけど、、、GPUを使用するジョブはGCCでコンパイルしたバイナリが早いね。
iccのみなら †
「Parallel Studio XE」でMPIが入っていない版をお持ちなら、一旦iccでopenmpiを作り上げ、作ったopnempiでrelionをコンパイルする必要がある.
[root@c ~]# cd /apps/src
[root@c src]# wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.0.tar.gz
[root@c src]# tar xf openmpi-4.1.0.tar.gz && cd $_
[root@c openmpi-4.1.0]# source /opt/intel/bin/compilervars.sh intel64
[root@c openmpi-4.1.0]# which icc
/opt/intel/compilers_and_libraries_2019.4.243/linux/bin/intel64/icc
[root@c openmpi-4.1.0]# CC=icc CXX=icpc ./configure --prefix=/apps/openmpi-4.1.0_icc-19.0.4 \
--with-tm=/opt/pbs --without-slurm
:
:
:
Open MPI configuration:
-----------------------
Version: 4.1.0
Build MPI C bindings: yes
Build MPI C++ bindings (deprecated): no
Build MPI Fortran bindings: mpif.h, use mpi
MPI Build Java bindings (experimental): no
Build Open SHMEM support: false (no spml)
Debug build: no
Platform file: (none)
Miscellaneous
-----------------------
CUDA support: no
HWLOC support: internal (external hlwoc version is less than internal version 2.0)
Libevent support: internal
PMIx support: Internal
Transports
-----------------------
Cisco usNIC: no
Cray uGNI (Gemini/Aries): no
Intel Omnipath (PSM2): no
Intel TrueScale (PSM): no
Mellanox MXM: no
Open UCX: no
OpenFabrics OFI Libfabric: no
OpenFabrics Verbs: yes
Portals4: no
Shared memory/copy in+copy out: yes
Shared memory/Linux CMA: yes
Shared memory/Linux KNEM: no
Shared memory/XPMEM: no
TCP: yes
Resource Managers
-----------------------
Cray Alps: no
Grid Engine: no
LSF: no
Moab: no
Slurm: no
ssh/rsh: yes
Torque: yes
OMPIO File Systems
-----------------------
DDN Infinite Memory Engine: no
Generic Unix FS: yes
IBM Spectrum Scale/GPFS: no
Lustre: no
PVFS2/OrangeFS: no
[root@c openmpi-4.1.0]# make; make install
確認
[root@c ~]# ls -l /apps/openmpi-4.1.0_icc-19.0.4/bin/
total 1032
-rwxr-xr-x 1 root root 1887 Feb 28 02:46 aggregate_profile.pl
lrwxrwxrwx 1 root root 12 Feb 28 02:46 mpic++ -> opal_wrapper
lrwxrwxrwx 1 root root 12 Feb 28 02:46 mpicc -> opal_wrapper
lrwxrwxrwx 1 root root 12 Feb 28 02:46 mpiCC -> opal_wrapper
lrwxrwxrwx 1 root root 12 Feb 28 02:46 mpicxx -> opal_wrapper
lrwxrwxrwx 1 root root 7 Feb 28 02:46 mpiexec -> orterun
lrwxrwxrwx 1 root root 12 Feb 28 02:46 mpif77 -> opal_wrapper
lrwxrwxrwx 1 root root 12 Feb 28 02:46 mpif90 -> opal_wrapper
lrwxrwxrwx 1 root root 12 Feb 28 02:46 mpifort -> opal_wrapper
lrwxrwxrwx 1 root root 7 Feb 28 02:46 mpirun -> orterun
lrwxrwxrwx 1 root root 10 Feb 28 02:46 ompi-clean -> orte-clean
-rwxr-xr-x 1 root root 152104 Feb 28 02:46 ompi_info
lrwxrwxrwx 1 root root 11 Feb 28 02:46 ompi-server -> orte-server
-rwxr-xr-x 1 root root 151816 Feb 28 02:45 opal_wrapper
lrwxrwxrwx 1 root root 12 Feb 28 02:46 ortecc -> opal_wrapper
-rwxr-xr-x 1 root root 143544 Feb 28 02:46 orte-clean
-rwxr-xr-x 1 root root 133688 Feb 28 02:46 orted
-rwxr-xr-x 1 root root 171904 Feb 28 02:46 orte-info
-rwxr-xr-x 1 root root 138736 Feb 28 02:46 orterun
-rwxr-xr-x 1 root root 140272 Feb 28 02:46 orte-server
-rwxr-xr-x 1 root root 2709 Feb 28 02:46 profile2mat.pl
[root@c ~]# ldd /apps/openmpi-4.1.0_icc-19.0.4/bin/opal_wrapper
linux-vdso.so.1 => (0x00007ffca0fe7000)
libopen-pal.so.40 => /apps/openmpi-4.1.0_icc-19.0.4/lib/libopen-pal.so.40 (0x00007fdcf27b3000)
libm.so.6 => /lib64/libm.so.6 (0x00007fdcf24b1000)
libudev.so.1 => /lib64/libudev.so.1 (0x00007fdcf229b000)
librt.so.1 => /lib64/librt.so.1 (0x00007fdcf2093000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007fdcf1e90000)
libz.so.1 => /lib64/libz.so.1 (0x00007fdcf1c7a000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fdcf1a64000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fdcf1848000)
libc.so.6 => /lib64/libc.so.6 (0x00007fdcf147a000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fdcf1276000)
libimf.so => /opt/intel/compilers_and_libraries_2019.4.243/linux/compiler/lib/intel64_lin/libimf.so (0x00007fdcf0cd6000)
libsvml.so => /opt/intel/compilers_and_libraries_2019.4.243/linux/compiler/lib/intel64_lin/libsvml.so (0x00007fdcef332000)
libirng.so => /opt/intel/compilers_and_libraries_2019.4.243/linux/compiler/lib/intel64_lin/libirng.so (0x00007fdceefc0000)
libintlc.so.5 => /opt/intel/compilers_and_libraries_2019.4.243/linux/compiler/lib/intel64_lin/libintlc.so.5 (0x00007fdceed4e000)
/lib64/ld-linux-x86-64.so.2 (0x00007fdcf2af4000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007fdceeb49000)
libdw.so.1 => /lib64/libdw.so.1 (0x00007fdcee8f8000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007fdcee6f3000)
libelf.so.1 => /lib64/libelf.so.1 (0x00007fdcee4db000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fdcee2b5000)
libbz2.so.1 => /lib64/libbz2.so.1 (0x00007fdcee0a5000)
[root@c ~]#
これでrelionをコンパイルしてみる
source /opt/intel/bin/compilervars.sh intel64
export PATH=/apps/openmpi-4.1.0_icc-19.0.4/bin:$PATH
export LD_LIBRARY_PATH=/apps/openmpi-4.1.0_icc-19.0.4/lib:$LD_LIBRARY_PATH
CC=icc CXX=icpc cmake -DCUDA=OFF -DCudaTexture=OFF -DALTCPU=ON -DMKLFFT=ON -DCMAKE_INSTALL_PREFIX=/apps/relion-3.1.1.icc ..
make; make install
GPU計算もさせるなら
source /opt/intel/bin/compilervars.sh intel64
export PATH=/apps/openmpi-4.1.0_icc-19.0.4/bin:$PATH
export LD_LIBRARY_PATH=/apps/openmpi-4.1.0_icc-19.0.4/lib:$LD_LIBRARY_PATH
CC=icc CXX=icpc cmake -DCUDA=ON -DCudaTexture=ON -DALTCPU=OFF -DMKLFFT=ON -DCMAKE_INSTALL_PREFIX=/apps/relion-3.1.1.icc-cuda ..
make; make install