並列計算とは /OpenMP の初歩 (1)
今 の内容
なぜ並列計算が必要か?
スーパーコンピュータの性能動向 1ExaFLOPS 次世代スハ コン 京 1PFLOPS 性能 1TFLOPS 1GFLOPS スカラー機ベクトル機ベクトル並列機並列機 X-MP ncube2 CRAY-1 S-810 SR8000 VPP500 CM-5 ASCI-5 ASCI-4 S3800 T3E-900 SR2201 天河 1 号 Jaguar Roadrunner 地球シミュレータ 1MFLOPS IBM360/95 CDC6600 スカラー / ベクトル機 並列機 (104times faster / 20 years) 1960 1970 1980 1990 2000 2010 年
TOP500 によるスーパーコンピュータ性能 較
2016 年 11 のリスト ( 上位 8 システム )
TOP500 で るアーキテクチャの変遷 100 50 0 1995 2000 2005 2010
頑張って勉強しましょう!
並列計算機のアーキテクチャ
SIMD と MIMD
共有メモリ型と分散メモリ型
共有メモリ型と分散メモリ型 ( 続き ) PU0 PU1 PU1 メモリメモリメモリ インターコネクト ネットワーク
ホモジニアス型とヘテロジニアス型
計算科学演習 I で使う並列計算機
π コンピュータ SPARC64 IXfx SPARC64 V9 + HPC-ACE コア数 16 コア 動作周波 数 1.65GHz キャッシュ L1-I L1-D 32KB/コア L2 12MB/ソケット メモリバンド幅 85GB/s 40nm CMOS, 21.9 mm 臼井英之 21.9 mm 並列計算とは/OpenMP の初歩 1
共有メモリ型並列計算機における並列 式
OpenMP
OpenMP の実 モデル :Fork Join モデル
OpenMP の構成要素
演習 1( 準備 ):Hello World を並列化してみよう! % mkdir enshu openmp1 % cd enshu openmp1 program hello world imp lic it none prin t, Hello World! end program % frtpx hello. f90 注意 : 計算ノードで計算を うのでコンパイル 実 法が変わります
型計算機上でのプログラム実 : キューイングシステム
演習 1( 続き ): ジョブスクリプトの作成 #!/bin/bash #PJM -N jobname #PJM -L rscgrp=small #PJM -L node=1 #PJM -L elapse=2:00 #PJM -j export OMP_NUM_THREADS=1. / a. out シェルを指定ジョブ名を指定投 先のキュー名を指定使 ノード数を指定 スレッド数を指定実 プログラム名を指定
演習 1( 続き ): ジョブの投 演習 pjsub ( ジョブスクリプト名 ) pjstat JOB ID JOB NAME MD ST USER START DATE ELAPSE LIM NODE REQUIRE 17583 jobname NM RUN user (05/19 16:23) 0000:02:00 1 17584 jobname NM QUE user (05/19 16:33) 0000:02:00 1 pjdel ( ジョブ番号 ) % pjsub hello.sh [INFO] PJM 0000 pjsub Job 17583 submitted. cat
演習 1( これで最後 ):OpenMP を いた Hello World の並列化 program hello world imp lic it none integer :: omp_get_thread_num!$ompparallel p r i n t, My id is, omp_get_thread_num(), Hello World!!$omp end parallel end program % frtpx Kopenmp hello. f90 % pjsub hello.sh
プログラムの解説 program hello im plic it none!$ompparallel 並列リージョン end program
OpenMP 並列化プログラムの基本構成例 program main imp lic it none ( 逐次実 部分 )!$ompparallel ( 並列化したい部分 )!$omp end parallel ( 逐次実 部分 ) end program
マルチスレッドでの実 のイメージといくつかの 語
計算の並列化 (Work-Sharing 構造 ) a (1 :n) = a (1:n ) + 1
DO ループの分割 (!$omp do) programmain implicit none integer, parameter :: SP = kind(1.0) integer, parameter :: DP = selected_real_kind(2*precision(1.0_sp)) real(dp), dimension(100000) :: a, b integer :: i!$omp parallel!$omp do 直後の DO ループを複数のスレッド do i=1,100000 で分割して実 せよ, という意味 b(i) = a(i) (!$omp end do は省略可 ) end do!$omp end do!$omp end parallel 2 スレッドで実 した場合 スレッド 0 do i=1,50000 b(i) = a(i) end do スレッド 1 do i=50001,100000 b(i) = a(i) end do ( 分割の仕 はコンパイラ依存 ) end program
演習 2:omp do を使ってみよう!
演習 2 のプログラム program axpy i mp l ic i t none integer, parameter : : SP = kind (1. 0 ) integer, parameter : : DP = selected_ real_kind (2 precision ( 1. 0_SP )) r e a l (DP), dimension ( 100000 ) : : x, y, z re al (DP): : a integer : : i!! a,x,y の値を各 で 由に設定.!!$omp parallel!$omp do do i = 1, 100000 z ( i ) = a x ( i ) + y ( i ) ベクトルの加算 z = a x + y end do!$omp end do!$omp end parallel!! 経過時間の確認! p rin t, z ( 1 ) end program
時間計測 ジョブスクリプトの例
演習 3:!$omp parallel do!$ompparallel!$omp parallel do!$ompdo do i=1,100000 do i=1,100000 b(i) = a(i) b(i) = a(i) end do end do!$omp end parallel do!$omp end do!$omp end parallel!$omp end parallel do
注意 omp do は並列実 できない場合も 動的に分割してしまう! program i n v l i mp l ic i t none integer, parameter : : n = 100 integer, dimension ( n ) : : a integer : : i a ( 1 ) = 0!$omp parallel do do i =2,n a ( i ) = a ( i 1) + 1 end do! $omp end paralleldo p rin t, a (n ) end program 正しい結果 :99 2 スレッドで実 スレッド 0 do i=1,50 a(i) = a(i-1) + 1 end do スレッド 1 do i=51,100 a(i) = a(i-1) + 1 end do 本当は a(50) の結果がないと実 できない!
do ループの並列化のまとめ do i =2,100 x ( i ) = a x ( i 1) + b end do
omp workshare!$ompdo do i=1,100000 z(i) = a x(i) + y(i) end do!$omp end do!$omp end parallel!$omp workshare z(:) = a x(:) + y(:)!$omp end workshare (!$omp end workshare は省略不可 ) C = matmul(a, B)!$omp end workshare
mail s 自分のアカウント名 kobeuniv.compra1@gmail.com < result.txt
mail s 自分のアカウント名 kobeuniv.compra1@gmail.com < result.txt