1/15 に行う並列計算勉強会の資料
1 次元配列の要素ごとの操作を行うテストをone_dimensional
ディレクトリに
2 次元配列を用いるテストをtwo_dimensional
ディレクトリに
one_dimensional
あるいはtwo_dimensional
ディレクトリで
$bash execution.sh
とすると実行されます
変数 | 定義しているファイル | 説明 |
---|---|---|
nsize | main.f90 | 配列サイズ |
nloop | execusion.sh | 繰り返し回数 |
ntrial | execusion.sh | 試行回数 |
napara | execusion.sh | 自動並列化のスレッド数(0 なら off) |
nomp | execusion.sh | OpenMP のスレッド数 |
compiler_type | execusion.sh | 利用するコンパイラ(gfortran など) |
build_type | execusion.sh | debug:最適化オプションなし.fast:最適化オプションモリモリ |
set(CMAKE_Fortran_FLAGS_DEBUG "-O0 -Wall -pedantic -std=f2008
-fbounds-check -Wuninitialized
-ffpe-trap=invalid,zero,overflow
-fbacktrace -g -Ddebug
${omp_option} ${autopara_option}")
set(CMAKE_Fortran_FLAGS_PROFILE "-O3 -march=narive -mtune=native -p
${omp_option} ${autopara_option}")
set(CMAKE_Fortran_FLAGS_FAST "-O3 -march=native -mtune=native
${omp_option} ${autopara_option}")
omp_option
とautopara_option
はそれぞれ omp.txt と apara.txt から読み込まれます(execusion.sh を実行した場合,この二つのテキストファイルは自動生成されます)
omp_get_wtime
を用います
nloop 回の繰り返しを ntrial 回試行して,平均と標準偏差を出力します
src/one_dimensional 一次元配列の要素ごとの和・積・商などを求めています
配列の宣言位置や,変数の型による計算時間の違いを確認します
- main で定義し,静的記憶領域(static)に置かれることを期待
- module 内 subroutine で定義し,スタック領域(stack)に置かれることを期待
- module 内 subroutine で allocate した,ヒープ領域(heap)に置かれることを期待
src/two_dimensional 二次元配列で隣接データを参照するような(配列構文では書きにくい?)問題
とりあえず,次の二つを実装しました jacobi 法 roe の近似リーマン解法
ヤコビ法を例に
! implementation 1 : sequential do
do l=1,nl
do k=2,nsize-1
do j=2,nsize-1
b(j,k) = 0.25d0*(a(j,k-1)+a(j-1,k)+a(j+1,k)+a(j,k+1))
end do
end do
end do
! implementation 2 : OpenMP do
do l=1,nl
!$omp parallel do shared(a,b,nsize) private(j,k,s)
do k=2,nsize-1
do j=2,nsize-1
b(j,k) = 0.25d0*(a(j,k-1)+a(j-1,k)+a(j+1,k)+a(j,k+1))
end do
end do
!$omp end parallel do
end do
! implementation 3 : do concurrent
do l=1,nl
do concurrent(k=2:nsize-1,j=2:nsize-1)
b(j,k) = 0.25d0*(a(j,k-1)+a(j-1,k)+a(j+1,k)+a(j,k+1))
end do
end do
nsize=1000.つまり配列サイズは(1000,1000)
nsize=200