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とか)から装備されている。

表にするとこんな感じ

マイクロ
アーキテクチャ
HaswellSkylakeSunny Cove
世代Haswell
第4世代Core
Broadwell
第5世代Core
Skylake
第6世代Core
Kaby Lake
第7世代Core
Coffee Lake
第8世代Core
Coffee Lake Refresh
第9世代Core
Cascade LakeIce 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 Ei9
i7
i5
i3
i9x(109xx)
Xeon W-2200
Xeon W-3200
i9
i7
i5
i3
AVX2
AVX512xxxxxxxxxxxx

準備

インテルコンパイラーの導入方法は省略
インストール項目は

    インテル(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

その後に

relion

を実行します。そうしないとインテルさんのライブラリが読めないので起動しません。

実行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

トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2021-02-28 (日) 20:49:05 (48d)