地域密着型エリア広告配信リクルートの地域密着型広告ドコイク?アドネットワーク Ads by ドコイク?[無料でホームページを作成] [通報・削除依頼]
[無料でホームページを作成] [通報・削除依頼]

並列化

  ここでは並列化の方法について記述する。
--------------------------------------------------------------------------------
■ プログラミングにおける並列化
----------
◇ OpenMP
 簡単な並列化であれば、ディレクティブを挿入するだけでよく、並列化オプションをつけない場合には、コメント行となるので、基本的にオリジナルの変更が不要な利点がある。

・設定の仕方
 下記のように、call 文の前に !$omp parallel、後に !$omp end parallel を記述する。呼び出すサブルーチンの中にある doループの前に !$omp parallel do を記述する。

!$omp parallel
call a(b, x, y, z)
!$omp end parallel

subroutine a(b, x, y, z)
(省略)
!$omp parallel do
  do 1=1, 100
    z(i) = b*x(i) + y
  end do
  return
end
----------
◇ MPI
 それぞれのノードで割り振られた部分だけを計算し、通信するデータ量も指定する。

・設定の仕方
 OpenMPやOpenACCと比べて記述は多くなるが、高い並列化を得られやすい。

call MPI_INIT(IERR)
call MPI_COMM_SIZE(MPI_COMM_WORLD,NPROCS,IERR)
call MPI_COMM_RANK(MPI_COMM_WORLD,MYRANK,IERR)

call para_range(1, n, nprocs, myrank, ista, iend)
do i=ista, iend
  a(i)=a(i)+value
end do

call MPI_ALLREDUCE(a,a1,n_element,
  & MPI_DOUBLE_PRECISION,
  & MPI_SUM, MPI_COMM_WORLD, IERR)
call MPI_FINALIZE(IERR)

※ ista から iend までが各プロセッサに割り振られる。
※ call MPI_ALLREDUCE で各プロセッサに割り振られて計算されたa(i)を纏める。まとめられたa(i)は各プロセッサに同じ値が渡される。
----------
◇ OpenACC (Open Accelerator)
 これはGPUを用いたものである。OpenMPと似た記述になるようにしている。
 開発環境として、コンパイラが出力するメッセージに従って、プログラムを改善していくことで、最善の結果が得られるようになっている。

・ 設定の仕方
 下記のように、doループの前に、!$acc parallel loop、doループの終わりであるend do の後に !$acc end parallel loop を記述する。

!$acc parallel loop
  do 1=1, 100
    z(i) = b*x(i) + y
  end do
!$acc end parallel loop
  return
end
----------
[0] CMD25、講義資料
[1] http://www.nvidia.co.jp/object/openacc-gpu-directives-jp.html
[2] http://www.cms-initiative.jp/ja/events/2014-haishin
※ 古典MD(classical MD)では専用機であるAntonを用いること!
※ Intel のコンパイラには自動並列化のオプション -parallel が存在する。しかしながら、OpenMPやMPIによって並列化されているコードの方が計算速度が速いことをよく経験する。
※ 余暇の有り余っている方は、MPIに挑戦してみるのも良いだろう。
--------------------------------------------------------------------------------
■ 並列化の評価方法
◇ Amdahl's Law: [1]
 Speed-up ratio = 1 / ( (1-P) + P/n )
ここで、nはコア数、Pは並列化できる部分に対する並列化しないときの時間
◇ Gustafson-Baris's Law: Amdahl's Lawよりも楽観的な見方。 [2]
 Speed-up ratio <= n + (1-n) * s
ここで、nはコア数、sは逐次計算での比(並列化できない部分)
[1] http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%A0%E3%83%80%E3%83%BC%E3%83%AB%E3%81%AE%E6%B3%95%E5%89%87
[2] http://ja.wikipedia.org/wiki/%E3%82%B0%E3%82%B9%E3%82%BF%E3%83%95%E3%82%BD%E3%83%B3%E3%81%AE%E6%B3%95%E5%89%87
--------------------------------------------------------------------------------
■ 下記のHPを参考にすれば、並列化の方法が分かるようになる。
実験化学者が作るPCクラスター: http://pccluster.web.fc2.com/index.html
超並列計算研究会 : http://www.is.doshisha.ac.jp/SMPP/
理化学研究所での講習会 : http://accc.riken.jp/HPC/training.html
F. Kusuhara at Kubo and Shiohara Labo. :
http://www.rcs.arch.t.u-tokyo.ac.jp/kusuhara/index-j.html 
並列計算機の使い方・設定の仕方(備忘録):
http://www2.kobe-u.ac.jp/~lerl2/calc_j.htm
http://blog.livedoor.jp/rootan2007/archives/51305070.html

■ WIEN2kで他のPCとMPI並列をする場合
intel fortran compiler での オプションに -i-static を入れて、PCに NFS を設定することがMPI並列を成功させる鍵となる。文献 [11 - 14] を参照するとNFSの設定方法が書かれている。

参考文献
[1] http://jpdb.nihs.go.jp/abinitmp/MPICH2%E7%92%B0%E5%A2%83%E3%81%AE%E6%A7%8B%E7%AF%89%20Windows%20Vista,%207%20%E7%B7%A8%EF%BC%8864bit%E7%92%B0%E5%A2%83%E5%AF%BE%E5%BF%9C%EF%BC%89%2020100819TN-0.pdf
[2] http://www2.itc.nagoya-u.ac.jp/pub/pdf/pdf/vol03_03/194_225kouza.pdf 
[3] http://www.pasoble.jp/windows/7/08853.html
[4] http://www.tigers-net.com/support/manual/win7_security/win7_firewall.html
[5] http://27bit.com/os-7-port.html
[6] http://freesoft.tvbok.com/tips/win7rc64/login_administrator.html
[7] http://www.adminweb.jp/windows7/uac/index3.html
[8] http://www.gigafree.net/faq/vista/
[9] http://itpro.nikkeibp.co.jp/article/COLUMN/20100914/352030/
[10] http://www.jamstec.go.jp/esc/simschool/f90learning/
[11] http://www.atmarkit.co.jp/flinux/rensai/linuxtips/367usenfs.html
[12] http://kajuhome.com/nfs.shtml
[13] http://mountainbigroad.jp/fc5/nfs.html
[14] http://unixlife.jp/unixlife/linux/s-nfs.jsp
-------------------------------------------------------------------------------
■ LAM 
1) http://www.lam-mpi.org/ , http://www.lam-mpi.org/7.1/download.php
2) tar zxvf lam-7.1.4.tar.gz
3) cd lam-7.1.4
4) ./configure CC=icc CXX=icpc FC=ifort --prefix=/usr/lib/lam
5) make
6) sudo make install
--------------------------------------------------------------------------------
■ OpenMPI
1) http://www.open-mpi.org/
2) tar zxvf openmpi-1.4.3.tar.gz
3) cd openmpi-1.4.3
4) sudo su
5) ./configure -prefix=/usr/local/openmpi CXX=icpc CC=icc FC=ifort F90=ifort F77=ifort
6) make
7) make install
--------------------------------------------------------------------------------
■ MPICH
1) tar -zxvf mpich-1.2.7p1.tar.gz
2) cd mpich-1.2.7p1
3) sudo su
4) ./configure -prefix=/usr/local/mpich -opt=-O2 -c++=icpc -cc=icc -fc=ifort -f90=ifort -f77=ifort --with-arch=LINUX
5) make
6) make install
7) /usr/local/mpich/share/machines.LINUX にMPIで利用するマシン名の一覧を記入
8) 上記のprefixにした場合は、/usr/local/mpich/bin/mpif90 でコンパイルが可能になる
--------------------------------------------------------------------------------
■ 並列計算を実行する前に必要なrshの設定(CentOS の場合)
1) 「System」→「Administration」→「Add/Remove Software」
2) 左上にある検索の欄で、「rsh-server」を入力して対応するソフトを探す。
3) Querying が消えるまで待つ。
4) 右側にインストールするソフトの候補が現れるので、インストールしたいrshと書かれたものにチェックを入れて、「Apply」を押してインストールする。
5) rpm -qa rsh-server, rpm -qa xinetd
  rsh-server, eintedがインストールされていることを確認する
6) su
7) /sbin/chkconfig rsh on
  ブート時に rsh を自動的に起動するように設定する
8) /sbin/chkconfig rlogin on
  ブート時にrloginを自動的に起動するように設定する
9) /sbin/service xinetd restart
  ブート時にxinetd を自動的に起動するように設定する
10) ホームディレクトリに .rhosts ファイルへ通信するマシン全てと localhost.localdomain を記述
    kwrite ~/.rhosts
    localhost.localdomain
    host1
    host2
    host3
11) .rhosts のパーミッションを600にする。chmod 600 ~/.rhosts
12) rsh の動作確認
    rsh localhost.localdomain hostname
    rsh host1 hostname
参考HP : http://mase.itc.nagoya-u.ac.jp/~hirano/pukiwiki/index.php?CentOS5%A4%C7rsh%A4%F2%CD%AD%B8%FA%A4%CB%A4%B9%A4%EB
--------------------------------------------------------------------------------
■ ベンチマーク (Abinit)
 下記の結果から分かるように、4コア(8スレッド)のCPUを用いた場合には、MPI並列のみでのmpirun -np 4 がもっとも速い。OpenMPのみを用いる場合には、export OMP_NUM_THREADS=4 がもっとも速い。そして、MPI並列 > OpenMP並列となっている。
 ここには記していないが、gfortranではなく、intel fortran を用いると計算速度が1-3割向上。
 Intel® Core™ i7-3820 CPU @ 3.60GHz × 8 は Intel® Core™ i7-2700K CPU @ 3.50GHz × 8 より計算速度が2割程度向上する。クロック数の向上は僅かのため、L3キャッシュが効いているかもしれない。

PWscf: espresso-5.0.2.tar.gz
PWgui: pwgui-5.0-linux-x86_64.tgz
PAW: http://theossrv1.epfl.ch/Main/Pseudopotentials -> pbe.0.3.1.tgz

Abinit: ABINIT 7.6.4
PAW: http://www.abinit.org/downloads/PAW2/JTH-TABLE/index.html -> http://www.abinit.org/downloads/PAW2/JTH-TABLE/index.html

■ Abinit test case
http://www.abinit.org/downloads/PAW2/JTH-TABLE/index.html -> C.GGA_PBE-JTH-paw.xml

tpaw1_1.files
----------
tpaw1_1.in
tpaw1_1.out
tpaw1_1i
tpaw1_1o
tpaw1_1tmp
./C.GGA_PBE-JTH-paw.xml
----------

tpaw1_2.files (リリース 12.04 (precise) 64-bit, Intel® Core™ i7-2700K CPU @ 3.50GHz × 8 )
◆ OpenMPI + OpenMP (gfrotran) case
highest speed: export OMP_NUM_THREADS=1 + mpirun -np 4 /usr/local/bin/abinit <tpaw1_2.files

Resutls
------------------
export OMP_NUM_THREADS=1
mpirun -np 1 /usr/local/bin/abinit <tpaw1_2.files
   Proc.   0 individual time (sec): cpu=         16.5  wall=         16.6
mpirun -np 2 /usr/local/bin/abinit <tpaw1_2.files
   Proc.   0 individual time (sec): cpu=         12.1  wall=         12.1
mpirun -np 2 /usr/local/bin/abinit <tpaw1_2.files
   Proc.   0 individual time (sec): cpu=         11.0  wall=         11.1
mpirun -np 4 /usr/local/bin/abinit <tpaw1_2.files
   Proc.   0 individual time (sec): cpu=         10.7  wall=         10.7
mpirun -np 5 /usr/local/bin/abinit <tpaw1_2.files
   Proc.   0 individual time (sec): cpu=         12.6  wall=         12.6
------------------
export OMP_NUM_THREADS=2
mpirun -np 1 /usr/local/bin/abinit <tpaw1_2.files
   Proc.   0 individual time (sec): cpu=         21.3  wall=         13.8
mpirun -np 2 /usr/local/bin/abinit <tpaw1_2.files
   Proc.   0 individual time (sec): cpu=         15.8  wall=         11.2
mpirun -np 3 /usr/local/bin/abinit <tpaw1_2.files
   Proc.   0 individual time (sec): cpu=         15.3  wall=         11.1
mpirun -np 4 /usr/local/bin/abinit <tpaw1_2.files
   Proc.   0 individual time (sec): cpu=         15.6  wall=         12.2
------------------
export OMP_NUM_THREADS=3
mpirun -np 1 /usr/local/bin/abinit <tpaw1_2.files
   Proc.   0 individual time (sec): cpu=         26.5  wall=         13.2
------------------
export OMP_NUM_THREADS=4
mpirun -np 1 /usr/local/bin/abinit <tpaw1_2.files
   Proc.   0 individual time (sec): cpu=         32.4  wall=         12.9
mpirun -np 2 /usr/local/bin/abinit <tpaw1_2.files
   Proc.   0 individual time (sec): cpu=         27.9  wall=         12.9
------------------
export OMP_NUM_THREADS=6
mpirun -np 1 /usr/local/bin/abinit <tpaw1_2.files
   Proc.   0 individual time (sec): cpu=         50.8  wall=         13.9
------------------
export OMP_NUM_THREADS=8
mpirun -np 1 /usr/local/bin/abinit <tpaw1_2.files
   Proc.   0 individual time (sec): cpu=         91.5  wall=         18.3
------------------
ngkpt 6 6 6
nshiftk 4
shiftk 0.5 0.5 0.5
       0.5 0.0 0.0
       0.0 0.5 0.0
       0.0 0.0 0.5
------------------

QE-ABINIT
0. http://qe-forge.org/gf/project/q-e/frs/?action=FrsReleaseBrowse&frs_package_id=32
  or http://qe-forge.org/gf/project/q-e/frs/?action=FrsReleaseBrowse&frs_package_id=32
1. tar zxvf QE-ABINIT.tar.gz
2. cd QE*
3. patch -p0 -d < QE-ABINIT-diff
-----------------------------------------------------------------------------
■ ベンチマーク (Elk)
-----
http://sourceforge.net/p/elk/discussion/897820/thread/10a7ccbf/

I tested using a standard desktop PC with a Intel Core i5-2500 3.30GHz running Ubuntu 12.04 x64. I used the standard compiler options (-O3 -ip -unroll -no-prec-div -openmp) for ifort and (-O3 -ffast-math -funroll-loops -fopenmp) for gfortran. With ifort I tested both the Elk included BLAS/LAPACK libraries and the Intel MKL BLAS/LAPACK libraries. With gfortran only the Elk libraries.

The times are as reported by the makefile modification (repeatable to within 0.5 sec)

Elk v2.2.10
gfortran (v4.6.3) Elk libraries 154.7 sec
ifort (v14.0.1) Elk libraries 131.5 sec (note: see other post)
ifort (v14.0.1) Intel MKL libraries 126.6 sec

I also tested Elk(v2.2.1) to see how the code has improved (note: tests may have changed slightly)

Elk v2.2.1
gfortran (v4.6.3) Elk libraries 210.1 sec
ifort (v14.0.1) Intel MKL libraries 146.6 sec

-----
http://sourceforge.net/p/elk/discussion/897820/thread/10a7ccbf/

I have done a little additional testing of FFT libraries. Elk includes support for 3 FFT libraries. The built in FFTPACK, FFTW3 and Intel MKL. I have tested using Intel MKL BLAS/LAPACK libraries (v11.1.1) with dynamic linking.

I built them all using ifort (v14.0.1) with -O3 -ip -unroll -no-prec-div -openmp -xhost -mkl=sequential

The results:
Elk FFTPACK 121.6 sec
FFTW (v3.3.3) 114.6 sec
Intel MKL FFT 114.7 sec
-----
http://sourceforge.net/p/elk/discussion/897820/thread/10a7ccbf/

A quick update from the gfortran/openblas side:
1. The bug in the haswell-enabled development version of openblas has been fixed - turned out they had inadvertently disabled openmp support in their copy of LAPACK.
2. For gfortran, one should add at least -mtune=native to the list of compiler flags to avoid trading performance for portability. For my tests, I ended up with the full (and possibly somewhat redundant) list of
-O3 -ffast-math -funroll-loops --param max-unroll-times=2 -fopenmp -march=native -mtune=native -mavx -msse -msse2 -msse3 -msse4 -msse4.1 -msse4.2 -fprefetch-loop-arrays -fvariable-expansion-in-unroller -mfpmath=sse
snarfed from a discussion of compiler benchmarks on the gcc-devel mailing list.

On an i7-4770K@3.4GHz,gcc-4.8.1,openblas-0.2.9.rc and setting OMP_NUM_THREADS=4 to avoid blocking on the HT pseudocores, the tests now complete in 122.6 seconds. I will try with FFTW next.

-----------------------------------------------------------------------------


QRコード
携帯用QRコード
アクセス数
ページビュー数