概要 OpenACC とは OpenACC について OpenMP, CUDA との違い OpenACC の指示文 並列化領域指定指示文 (kernels/parallel) データ移動指示文 ループ指示文 OpenACC の実用例 実習 コンパイラメッセージの見方 OpenACC プログラムの実装

Size: px
Start display at page:

Download "概要 OpenACC とは OpenACC について OpenMP, CUDA との違い OpenACC の指示文 並列化領域指定指示文 (kernels/parallel) データ移動指示文 ループ指示文 OpenACC の実用例 実習 コンパイラメッセージの見方 OpenACC プログラムの実装"

Transcription

1 第 74 回お試しアカウント付き 並列プログラミング講習会 GPU プログラミング入門 in 名古屋 星野哲也 ( 助教 ) hoshino@cc.u-tokyo.ac.jp 大島聡史 ( 助教 ) ohshima@cc.u-tokyo.ac.jp 2016 年 3 月 14 日 ( 火 ) 東京大学情報基盤センター

2 概要 OpenACC とは OpenACC について OpenMP, CUDA との違い OpenACC の指示文 並列化領域指定指示文 (kernels/parallel) データ移動指示文 ループ指示文 OpenACC の実用例 実習 コンパイラメッセージの見方 OpenACC プログラムの実装 各種ツールの使い方 NVIDIA Visual Profiler など GPU プログラミング入門 2

3 OpenACC とは GPU プログラミング入門 3

4 OpenACC OpenACC とは アクセラレータ (GPU など ) 向けの OpenMP のようなもの 既存のプログラムのホットスポットに指示文を挿入し 計算の重たい部分をアクセラレータにオフロード そのための指示文セットがOpenACC 対応言語 : C/C++, Fortran 指示文ベース 指示文 : コンパイラへのヒント 記述が簡便, メンテナンスなどをしやすい コードの可搬性 (portability) が高い 対応していない環境では無視される GPU プログラミング入門 C/C++ #pragma acc kernels for(i = 0;i < N;i++) {. } Fortran!$acc kernels do i = 1, N.!$acc end kernels 4

5 OpenACC 規格 各コンパイラベンダ (PGI, Crayなど ) が独自に実装していた拡張 を統合し共通規格化 ( 年秋にOpenACC 1.0 最新の仕様はOpenACC 2.5 対応コンパイラ 商用 :PGI, Cray, PathScale 研究用 :Omni (AICS), OpenARC (ORNL), OpenUH (U.Houston) フリー :GCC 6.x 開発中 ( 開発状況 : 実用にはまだ遠い GPU プログラミング入門 5

6 OpenACC と OpenMP の実行イメージ 1 スレッド OpenMP OpenACC int main() { #pragma for(i = 0;i < N;i++) { } } CPU CPU CPU デバイス GPU プログラミング入門 6

7 OpenACC と OpenMP の比較 OpenMP の想定アーキテクチャ マルチコア CPU 環境 MEMORY 計算コアが N 個 N < 100 程度 (Xeon Phi 除く ) CPU(s) 共有メモリ 計算コア 計算コア 計算コア 計算コア 計算コア 計算コア 計算コア 計算コア 一番の違いは対象アーキテクチャの複雑さ 7

8 OpenACC と OpenMP の比較 OpenACC の想定アーキテクチャ アクセラレータを備えた計算機環境 MEMORY ( ホスト ) CPU(s) MEMORY ( デバイス ) 計算コア N 個を M 階層で管理 N > 1000 を想定 階層数 M はアクセラレータによる ホスト - デバイスで独立したメモリ ホスト - デバイス間データ転送は低速 一番の違いは対象アーキテクチャの複雑さ 8

9 OpenACC と OpenMP の比較 OpenMPと同じもの Fork-Joinという概念に基づく並列化 OpenMPになくてOpenACCにあるもの ホストとデバイスという概念 ホスト-デバイス間のデータ転送 多階層の並列処理 OpenMPにあってOpenACCにないもの スレッドIDを用いた処理など OpenMP の omp_get_thread_num() に相当するものが無い その他 気をつけるべき違い OpenMPと比べてOpenACCは勝手に行うことが多い 転送データ 並列度などを未指定の場合は勝手に決定 9

10 想定されるハードウェア構成 ネットワーク CPU GPU ~20GB/s ~32GB/s (PCI-Express) ~200GB/s ~1,000GB/s メインメモリ (DDR など ) デバイスメモリ (GDDR など 今後は HBM など ) デバイス内外のデータ転送速度差的にも 対象とするプロセッサ内で計算が完結していることが望ましい 10

11 OpenACC と CUDA の違い OpenACC 指示文ベース 対象 : アクセラレータ全般 記述の自由度 高レベルな抽象化 ある程度勝手にやってくれる デバイスに特化した機能は使えない shuffle 機能を使えないなど CUDA 言語拡張 対象 :NVIDIA GPU のみ 記述の自由度 低レベルな記述 書いたようにしかやらない デバイスの持つ性能を十分に引き出せる プログラムの可搬性 可読性 ただし簡単ではない! 性能 GPU プログラミング入門 11

12 最低限動くプログラムを作るには 1. オフロードする領域を決める OpenACC subroutine matmul(a, b, c, n) real(8), dimension(n, n) :: a, b, c integer :: n integer :: i, j, k real(8) :: cc do j = 1, n do i = 1, n cc = 0 do k = 1, n cc = cc + a(i,k) * b(k,j) c(i,j) = cc end subroutine matmul attribute(global) subroutine mm_cuda(a, b, c, n) integer, value :: n real(8), dimension(n, n) :: a, b, c integer :: i, j, k real(8) :: cc i = (blockidx%x-1) * blockdim%x + threadidx%x j = (blockidx%y-1) * blockdim%y + threadidx%y cc = 0.0 do k = 1, n cc = cc + a(i, k) * b(k, j) CUDA c(i, j) = cc end subroutine mm_cuda subroutine matmul(a, b, c, n) real(8), dimension(n, n) :: a, b, c integer :: n integer :: i, j, k real(8) :: cc do j = 1, n do i = 1, n cc = 0 do k = 1, n cc = cc + a(i,k) * b(k,j) c(i,j) = cc end subroutine matmul 12

13 最低限動くプログラムを作るには 2. オフロード領域の並列化 カーネルコードの記述 OpenACC CUDA attribute(global) subroutine mm_cuda(a, b, c, n) integer, value :: n real(8), dimension(n, n) :: a, b, c integer :: i, j, k real(8) :: cc i = (blockidx%x-1) * blockdim%x + threadidx%x j = (blockidx%y-1) * blockdim%y + threadidx%y cc = 0.0 do k = 1, n cc = cc + a(i, k) * b(k, j) c(i, j) = cc end subroutine mm_cuda subroutine matmul(a, b, c, n) real(8), dimension(n, n) :: a, b, c integer :: n integer :: i, j, k real(8) :: cc!$acc kernels do j = 1, n do i = 1, n cc = 0 do k = 1, n cc = cc + a(i,k) * b(k,j) c(i,j) = cc!$acc end kernels end subroutine matmul OpenACC はこの時点で実行可能! subroutine matmul(a, b, c, n) real(8), dimension(n, n) :: a, b, c integer :: n integer :: i, j, k real(8) :: cc do j = 1, n do i = 1, n cc = 0 do k = 1, n cc = cc + a(i,k) * b(k,j) c(i,j) = cc end subroutine matmul 13

14 最低限動くプログラムを作るには 3. GPU 用のメモリを確保し 明示的にデータ転送する OpenACC subroutine matmul(a, b, c, n) real(8), dimension(n, n) :: a, b, c integer :: n integer :: i, j, k real(8) :: cc!$acc data copyin(a, b) copyout(c)!$acc kernels do j = 1, n do i = 1, n cc = 0 do k = 1, n cc = cc + a(i,k) * b(k,j) c(i,j) = cc!$acc end kernels!$acc end data end subroutine matmul CUDA attribute(global) subroutine mm_cuda(a, b, c, n) integer, value :: n real(8), dimension(n, n) :: a, b, c integer :: i, j, k real(8) :: cc i = (blockidx%x-1) * blockdim%x + threadidx%x j = (blockidx%y-1) * blockdim%y + threadidx%y cc = 0.0 do k = 1, n cc = cc + a(i, k) * b(k, j) c(i, j) = cc end subroutine mm_cuda subroutine matmul(a, b, c, n) real(8), dimension(n, n) :: a, b, c integer :: n integer :: i, j, k real(8) :: cc real(8), device, allocatable, dimension(:, :) :: & a_dev, b_dev, c_dev type(dim3) :: dimgrid, dimblcok allocate(a_dev(n, n), b_dev(n, n), c_dev(n, n)) a_dev(:, :) = a(:, :) b_dev(:, :) = b(:, :) dimgrid = dim3( n/16, n/16, 1) dimblock = dim3( 16, 16, 1) call mm_cuda<<<dimgrid, dimblock>>>(a, b, c, n) c(:, :) = c_dev(:, :) end subroutine matmul 14

15 最低限動くプログラムを作るには 4. スレッドを割り当てる OpenACC subroutine matmul(a, b, c, n) real(8), dimension(n, n) :: a, b, c integer :: n integer :: i, j, k real(8) :: cc!$acc data copyin(a, b) copyout(c)!$acc kernels!$acc loop gang do j = 1, n!$acc loop vector do i = 1, n cc = 0!$acc loop seq do k = 1, n cc = cc + a(i,k) * b(k,j) c(i,j) = cc!$acc end kernels!$acc end data end subroutine matmul CUDA attribute(global) subroutine mm_cuda(a, b, c, n) integer, value :: n real(8), dimension(n, n) :: a, b, c integer :: i, j, k real(8) :: cc i = (blockidx%x-1) * blockdim%x + threadidx%x j = (blockidx%y-1) * blockdim%y + threadidx%y cc = 0.0 do k = 1, n cc = cc + a(i, k) * b(k, j) c(i, j) = cc end subroutine mm_cuda subroutine matmul(a, b, c, n) real(8), dimension(n, n) :: a, b, c integer :: n integer :: i, j, k real(8) :: cc real(8), device, allocatable, dimension(:, :) :: & a_dev, b_dev, c_dev type(dim3) :: dimgrid, dimblcok allocate(a_dev(n, n), b_dev(n, n), c_dev(n, n)) a_dev(:, :) = a(:, :) b_dev(:, :) = b(:, :) dimgrid = dim3( n/16, n/16, 1) dimblock = dim3( 16, 16, 1) call mm_cuda<<<dimgrid, dimblock>>>(a, b, c, n) c(:, :) = c_dev(:, :) end subroutine matmul 15

16 OpenACC の指示文 GPU プログラミング入門 16

17 並列化領域指定指示文 :parallel, kernels アクセラレータ上で実行すべき部分を指定 OpenMP の parallel 指示文に相当 2 種類の指定方法 :parallel, kernels parallel:( どちらかというと ) マニュアル OpenMP に近い ここからここまでは並列実行領域です 並列形状などはユーザー側で指定します 的な概念 kernels:( どちらかというと ) 自動的 ここからここまではデバイス側実行領域です あとはお任せします 的な概念 細かい指示子 節を加えていくと最終的に同じような挙動になるので どちらを使うかは好み 17

18 kernels/parallel 指示文 kernels parallel program main!$acc kernels do i = 1, N! loop body!$acc end kernels program main!$acc parallel num_gangs(n)!$acc loop gang do i = 1, N! loop body!$acc end parallel end program end program GPU プログラミング入門 18

19 kernels/parallel 指示文 kernels parallel ホスト - デバイスを意識するのが kernels 並列実行領域であることを意識するのが parallel ホスト側 program main デバイス側 program main!$acc kernels do i = 1, N! loop body!$acc end kernels!$acc parallel num_gangs(n)!$acc loop gang do i = 1, N! loop body!$acc end parallel end program end program 並列数はデバイスに合わせてください 並列数 N でやってください GPU プログラミング入門 19

20 kernels/parallel 指示文 : 指示節 kernels async wait device_type if default(none) copy parallel async wait device_type if default(none) copy num_gangs num_workers vector_length reduction private firstprivate GPU プログラミング入門 20

21 kernels/parallel 指示文 : 指示節 kernels 非同期実行に用いる 今回は扱わない 実行デバイス毎にパラメータを調整 if(0)/if(.false.) などとするとホスト側で実行される データの自動転送を行わないようにする データ指示文の機能を使える ( 後述 ) parallel では並列実行領域であることを意識するため 並列数や変数の扱いを決める指示節がある parallel async wait device_type if default(none) copy num_gangs num_workers vector_length reduction private firstprivate GPU プログラミング入門 21

22 デバイス上で扱われるべきデータについて プログラム上の parallel/kernels 構文に差し掛かった時 OpenACC コンパイラは実行に必要なデータを自動で転送する 往々にして正しく転送されない 自分で書くべき 構文に差し掛かるたびに転送が行われる ( 非効率 ) 後述の data 指示文を用いて自分で書くべき 自動転送は default(none) で抑制できる スカラ変数は firstprivate として扱われる 指示節により変更可能 配列はデバイスに確保される (shared 的振る舞い ) 配列変数をスレッドローカルに扱うためには private を指定する GPU プログラミング入門 22

23 データ関連指示文 アクセラレータを備えた計算機環境 MEMORY ( ホスト ) MEMORY ( デバイス ) この間のデータ移動を CPU(s) data 指示文で行う ホスト - デバイス間のデータ移動を行う データの一貫性を保つのはユーザーの責任 ホスト - デバイス間のデータ転送は相対的に遅いので要最適化 CPU GPU ~20GB/s ~200GB/s ~32GB/s (PCI-Express) ~1,000GB/s GPU プログラミング入門 メインメモリ (DDR など ) デバイスメモリ (GDDR など 今後は HBM など ) 23

24 データ関連指示文 :data, enter/exit data デバイス側で扱われるべきデータとその領域を指定 CUDA でいう cudamalloc, cudamemcpy, cudafree を行う data 指示文 ( 推奨 ) cudamalloc + cudamemcpy (H D) + cudafree 構造ブロックに対してのみ適用可 コードの見通しが良い enter data 指示文 cudamalloc + cudamemcpy (H D) exit data とセット 構造ブロック以外にも使える exit data 指示文 cudamemcpy (H D) + cudafree enter data とセット 構造ブロック以外にも使える GPU プログラミング入門 24

25 データ関連指示文 :data 指示文 Fortran subroutine copy(dis, src) real(4), dimension(:) :: dis, src!$acc data copy(src,dis)!$acc kernels do i = 1, N dis(i) = src(i)!$acc end kernels!$acc end data end subroutine copy C 言語 void copy(float *dis, float *src) { int i; #pragma acc data copy(src[0:n] dis[0:n]) { #pragam acc kernels for(i = 0;i < N;i++){ dis[i] = src[i]; } } } 構造ブロックにのみ適用可 C 言語なら {} で囲める部分 GPU プログラミング入門 25

26 データ関連指示文 :data 指示文イメージ Fortran ( ホスト ) ( デバイス ) subroutine copy(dis, src) real(4), dimension(:) :: dis, src!$acc data copy(src,dis)!$acc kernels do i = 1, N dis(i) = src(i)!$acc end kernels!$acc end data end subroutine copy dis, src 2dis, src の値がコピーされる 3dis _dev, src _dev の値がコピーされる dis, src 1dis, src の領域が確保される dis_dev, src_dev デバイス上の計算 dis _dev, src _dev 4dis, src の領域が解放される GPU プログラミング入門 26

27 データ関連指示文 :enter/exit 指示文 void main() { double *q; int step; for(step = 0;step < N;step++){ if(step == 0) init(q); solvera(q); solverb(q);. if(step == N) fin(q); } } void init(double *q) { q = (double *)malloc(sizeof(double)*m); q = ; // 初期化 #pragma acc enter data copyin(q[0:m]) } void fin(double *q) { #pragma acc exit data copyout(q[0:m]) } print(q); // 結果出力 free(q); GPU プログラミング入門 27

28 データ関連指示文 : 指示節 data if copy copyin copyout create present present_or_... deviceptr CUDA などと組み合わせる時に利用 cudamalloc などで確保済みのデータを指定し OpenACC で扱い可とする enter data if async 非同期転送用 wait copyin create present_or_... enter data if async wait copyout delete GPU プログラミング入門 28

29 データ関連指示文 : 指示節 copy data 指示文へ差し掛かった時 ホスト側からデバイス側へデータをコピーし data 指示文終了時にデバイス側からホスト側へコピー copyin/copyout ホスト / デバイスからの入力 / 出力のみ行う create ただし OpenACC2.5 以降では copy, copyin, copyout の挙動は pcopy, pcopyin, pcopyout と同一 デバイス上に配列を作成 コピーは行わない present デバイス上に既に存在することを知らせる present_or_copy/copyin/copyout/create ( 省略形 :pcopy) など デバイス上に既にあれば copy/copyin/copyout/create せず なければする 29

30 データ関連指示文 : データ転送範囲指定 送受信するデータの範囲の指定 部分配列の送受信が可能 注意 :FortranとCで指定方法が異なる 二次元配列 A を転送する例 Fortran 版!$acc data copy(a(lower1:upper1, lower2:upper2) ) fortranでは開始点と終了点を指定!$acc end data C 版 #pragma acc data copy(a[start1:length1][start2:length2]) Cでは先頭と長さを指定 #pragma acc end data 30

31 データ関連指示文 :update 指示文 既にデバイス上に確保済みのデータを対象とする cudamemcpy (H D) の機能を持っていると思えば良い!$acc data copy( A(:,:) ) do step = 1, N!$acc update host( A(1:2,:) ) call comm_boundary( A )!$acc update device( A(1:2,:) )!$acc end data update if async wait device_type self #host と同義 host # H D device # H D GPU プログラミング入門 31

32 階層的並列モデルとループ指示文 OpenACC ではスレッドを階層的に管理 gang, worker, vector の 3 階層 gang:worker の塊一番大きな単位 worker:vector の塊 vector: スレッドに相当する一番小さい処理単位 loop 指示文 parallel/kernels 中のループの扱いについて指示 粒度 (gang, worker, vector) の指定 ループ伝搬依存の有無の指定 GPUでの行列積の例!$acc kernels!$acc loop gang do j = 1, n!$acc loop vector do i = 1, n cc = 0!$acc loop seq do k = 1, n cc = cc + a(i,k) * b(k,j) c(i,j) = cc!$acc end kernels 32

33 階層的並列モデルとアーキテクチャ OpenMPは1 階層 マルチコアCPUも1 階層 CUDAは block と thread の2 階層 NVIDA GPUも2 階層 NVIDIA Kepler GPUの構成 GPU デバイスメモリ SMX 1 SMX に複数 CUDA core を搭載 各コアは SMX のリソースを共有 OpenACC は 3 階層 今後出てくる様々なアクセラレータに対応するため CUDA コア 33 33

34 ループ指示文 : 指示節 loop collapse gang worker vector seq auto tile device_type independent private reduction GPU プログラミング入門 34

35 ループ指示文 : 指示節 loop collapse gang worker vector seq auto tile device_type independent private reduction 3 つのループが一重化される!$acc kernels!$acc loop collapse(3) gang vector do k = 1, 10 do j = 1, 10 do i = 1, 10.!$acc end kernels 並列化するにはループ長の短すぎるループに使う GPU プログラミング入門 35

36 ループ指示文 : 指示節 loop collapse gang worker vector seq auto tile device_type independent private reduction!$acc kernels!$acc loop gang(n) do k = 1, N!$acc loop worker(1) do j = 1, N!$acc loop vector(128) do i = 1, N.!$acc kernels!$acc loop gang vector(128) do i = 1, N. 数値の指定は難しいので 最初はコンパイラ任せでいい vector は worker より内側 worker は gang より内側 ただし 1 つのループに複数つけるのは OK GPU プログラミング入門 36

37 ループ指示文 : 指示節 loop collapse gang worker vector seq auto tile device_type independent private reduction B に間接参照 do j = 1, N do i = 1, N idxi(i) = i; idxj(j) = j!$acc kernels &!$acc& copyin(a, idxi, idxj) copyout(b)!$acc loop independent gang do j = 1, N!$acc loop independent vector(128) do i = 1, N B(idxI(i),idxJ(j)) = alpha * A(i,j)!$acc end kernels OpenACC コンパイラは保守的 依存関係が生じそうなら並列化しない GPU プログラミング入門 37

38 ループ指示文 : 指示節 loop collapse gang worker vector seq auto tile device_type independent private reduction!$acc kernels &!$acc loop reduction(+:val) do i = 1, N val = val + 1!$acc end kernels acc reduction (+:val) 演算子対象とする変数 簡単なものであれば PGI コンパイラは自動で reduction を入れてくれる 利用できる演算子 (OpenACC2.0 仕様書より ) GPU プログラミング入門 38

39 関数呼び出し指示文 :routine parallel/kernels 領域内から関数を呼び出す場合 routine 指示文を使う #pragma acc routine vector プロトタイプ宣言にもつける extern double vecsum(double *A); #pragma acc parallel num_gangs(n) vector_length(128) for (int i = 0;i < N; i++){ #pragma acc routine vector max = vecsum(a[i*n]); double vecsum(double *A){ } double x = 0; #pragma acc loop reduction(+:x) for(int j = 0;j < N;j++){ x += A[j]; } return x; GPU プログラミング入門 } 39

40 その他知っておくと便利なもの #ifdef _OPENACC OpenACC API の呼び出し時などに使う if clause の使い方 kernels/parallel, data 指示文などに使える fortran なら if(.false.), C なら if(0) を指定すると ホスト側で実行される デバッグに便利 atomic 並列領域内の atomic 領域を囲むことで利用 declare 指示文 fortran の module 内変数 C の global 変数などを使う時に用いる CUDA 関数の呼び出し CUDA 関数の呼び出しインターフェースも存在する 基本は OpenACC で作成し どうしても遅い部分だけ CUDA という実装が可能 GPU プログラミング入門 40

41 アプリケーションの移植方法 GPU プログラミング入門 41

42 アプリケーションの OpenACC 化手順 1. プロファイリングによるボトルネック部位の導出 2. ボトルネック部位のOpenACC 化 1. 並列化可能かどうかの検討 2. (OpenACCの仕様に合わせたプログラムの書き換え) 3. parallel/kernels 指示文適用 3. data 指示文によるデータ転送の最適化 4. OpenACCカーネルの最適化 1 ~ 4 を繰り返し適用 GPU プログラミング入門 42

43 アプリケーションの OpenACC 化手順 int main(){ double A[N]; sub1(a); sub2(a); sub3(a); } sub1 main sub2 sub3 ホスト デバイス sub2(double A){ suba(a); subb(a); } suba subb suba(double A){ } for( i = 0 ~ N ) { } 葉っぱの部分から OpenACC 化を始める GPU プログラミング入門 43

44 アプリケーションの OpenACC 化手順 int main(){ double A[N]; sub1(a); sub2(a); sub3(a); } sub1 main sub2 sub3 ホスト デバイス sub2(double A){ suba(a); subb(a); } suba data 指示文で配列 A をコピー subb suba suba(double A){ #pragma acc for( i = 0 ~ N ) { } } この状態でも必ず正しい結果を得られるように作る! この時 速度は気にしない! GPU プログラミング入門 44

45 アプリケーションの OpenACC 化手順 int main(){ double A[N]; sub1(a); #pragma acc data { sub2(a); } sub3(a); } sub1 main sub2 ホストデバイス data 指示文で配列 Aをコピー sub3 sub2 sub2(double A){ suba(a); subb(a); } suba subb suba subb suba(double A){ #pragma acc for( i = 0 ~ N ) { } } 徐々にデータ移動を上流に移動する GPU プログラミング入門 45

46 アプリケーションの OpenACC 化手順 int main(){ double A[N]; #pragma acc data { sub1(a); sub2(a); sub3(a); } } sub1 main sub2 ホストデバイス data 指示文で配列 Aをコピー sub3 sub1 main sub2 sub3 sub2(double A){ suba(a); subb(a); } suba subb suba subb suba(double A){ #pragma acc for( i = 0 ~ N ) { } } ここまで来たら ようやく個別のカーネルの最適化を始める データの転送時間が相対的に十分小さくなればいいので かならずしも最上流までやる必要はない GPU プログラミング入門 46

47 Q & A GPU プログラミング入門 47

48 実習 今回の実習の例は 全て PGI コンパイラ 16.4 を使った際の例です GPU プログラミング入門 48

49 実習概要 OpenACC プログラムのコンパイル PGIコンパイラのメッセージの読み方 OpenACC プログラムの作成 行列積 diffusion OpenACC プログラムの最適化 NVIDIA visual profiler の使い方など GPU プログラミング入門 49

50 OpenACC サンプル集 Reedbush へログイン $ ssh -Y reedbush.cc.u-tokyo.ac.jp l txxxxx module のロード $ module load pgi/17.1 $ module load cuda/ ワークディレクトリに移動 $ cdw OpenACC_samples のコピー $ cp /home/pz0108/z30108/openacc_samples.tar.gz. $ tar zxvf OpenACC_samples.tar.gz OpenACC_samples へ移動 $ cd OpenACC_samples $ ls C/ F/ #C と Fortran 好きな方を選択 GPU プログラミング入門 50

51 PGI コンパイラによるメッセージの確認 コンパイラメッセージの確認は OpenACC では極めて重要 OpenMP と違い 保守的に並列化するため 本来並列化できるプログラムも並列化されないことがある 並列化すべきループが複数あるため どのループにどの粒度 (gang, worker, vector) が割り付けられたかしるため ターゲットデバイスの性質上 立ち上げるべきスレッド数が自明に決まらず スレッドがいくつ立ち上がったか知るため メッセージを見て プログラムを適宜修正する コンパイラメッセージ出力方法 コンパイラオプションに -Minfo=accel をつける GPU プログラミング入門 51

52 PGI コンパイラによるメッセージの確認 OpenACC_samples を利用 $ make acc_compute コンパイラメッセージ (fortran) ソースコード 8. subroutine acc_kernels() 9. double precision :: A(N,N), B(N,N) 10. double precision :: alpha = integer :: i, j 12. A(:,:) = B(:,:) = !$acc kernels 15. do j = 1, N 16. do i = 1, N 17. B(i,j) = alpha * A(i,j) !$acc end kernels 21. end subroutine acc_kernels pgfortran -O3 -acc -Minfo=accel -ta=tesla,cc60 -Mpreprocess acc_compute.f90 -o acc_compute acc_kernels: 14, Generating implicit copyin(a(:,:)) Generating implicit copyout(b(:,:)) 15, Loop is parallelizable 16, Loop is parallelizable Accelerator kernel generated Generating Tesla code 15,!$acc loop gang, vector(4)! blockidx%y threadidx%y 16,!$acc loop gang, vector(32)! blockidx%x threadidx%x. GPU プログラミング入門 52

53 PGI コンパイラによるメッセージの確認 OpenACC_samples を利用 $ make acc_compute サブルーチン名 コンパイラメッセージ (fortran) pgfortran -O3 -acc -Minfo=accel -ta=tesla,cc60 -Mpreprocess acc_compute.f90 -o acc_compute acc_kernels: 配列 aはcopyin, bはcopyoutとして扱われます 14, Generating implicit copyin(a(:,:)) Generating implicit copyout(b(:,:)) 15, Loop is parallelizable 16, Loop is parallelizable Accelerator kernel generated Generating Tesla code 15,!$acc loop gang, vector(4)! blockidx%y threadidx%y 16,!$acc loop gang, vector(32)! blockidx%x threadidx%x. ソースコード GPU プログラミング入門 8. subroutine acc_kernels() 9. double precision :: A(N,N), B(N,N) 10. double precision :: alpha = integer :: i, j 12. A(:,:) = B(:,:) = !$acc kernels 15. do j = 1, N 16. do i = 1, N 17. B(i,j) = alpha * A(i,j) !$acc end kernels 21. end subroutine acc_kernels 15, 16 行目の 2 重ループは (32x4) のスレッドでブロック分割して扱います 53

54 PGI コンパイラによるメッセージの確認 OpenACC_samples を利用 $ make acc_compute コンパイラメッセージ (C) ソースコード (C) 40. void acc_kernels(double *A, double *B){ 41. double alpha = 1.0; 42. int i,j; / * A と B 初期化 */ 50. #pragma acc kernels 51. for(j = 0;j < N;j++){ 52. for(i = 0;i < N;i++){ 53. B[i+j*N] = alpha * A[i+j*N]; 54. } 55. } 56. } pgcc -O3 -acc -Minfo=accel -ta=tesla,cc60 -Mcuda acc_compute.c -o acc_compute acc_kernels: 配列 aはcopyin, 50, Generating implicit copy(b[: ]) bはcopyとして扱われます Generating implicit copyin(a[: ]) 51, Loop carried dependence of B-> prevents parallelization Loop carried backward dependence of B-> prevents vectorization Complex loop carried dependence of B->,A-> prevents parallelization Accelerator scalar kernel generated Accelerator kernel generated ループ伝搬依存が見つかったので並列化しませ Generating Tesla code んの意 ポインタAとBが同じ領域を指していること 51, #pragma acc loop seq を警戒して 並列化しない 52, #pragma acc loop seq 52, Complex loop carried dependence of B->,A-> prevents parallelization GPU プログラミング入門 54

55 PGI コンパイラによるメッセージの確認 OpenACC_samples を利用 $ make acc_compute コンパイラメッセージ (C) ソースコード (C) 59. void acc_kernels(double *restrict A, double *restrict B){ 60. double alpha = 1.0; 61. int i,j; / * A と B 初期化 */ 69. #pragma acc kernels 70. for(j = 0;j < N;j++){ 71. for(i = 0;i < N;i++){ 72. B[i+j*N] = alpha * A[i+j*N]; 73. } 74. } 75. } acc_kernels_restrict: 69, Generating implicit copy(b[: ]) Generating implicit copyin(a[: ]) 70, Loop carried dependence of B-> prevents parallelization Loop carried backward dependence of B-> prevents vectorization 71, Loop is parallelizable 2 次元配列を1 次元化して扱っているため i+j*n Accelerator kernel generated Generating Tesla code が実は同じ場所を指す可能性を考慮し 70 行 70, #pragma acc loop seq 目を並列化していない 71, #pragma acc loop gang, vector(128) /* blockidx.x threadidx.x */ GPU プログラミング入門 55

56 PGI コンパイラによるメッセージの確認 OpenACC_samples を利用 $ make acc_compute コンパイラメッセージ (C) ソースコード (C) 78. void acc_kernels(double *restrict A, double *restrict B){ 79. double alpha = 1.0; 80. int i,j; / * A と B 初期化 */ 88. #pragma acc kernels 89. #pragma acc loop independent 90. for(j = 0;j < N;j++){ 91. #pragma acc loop independent 92. for(i = 0;i < N;i++){ 93. B[i+j*N] = alpha * A[i+j*N]; 94. } 95. } 96. } acc_kernels_independent: 88, Generating implicit copy(b[: ]) Generating implicit copyin(a[: ]) 90, Loop is parallelizable 92, Loop is parallelizable Accelerator kernel generated Generating Tesla code ようやくまともに並列化 90, #pragma acc loop gang, vector(4) /* blockidx.y threadidx.y */ 92, #pragma acc loop gang, vector(32) /* blockidx.x threadidx.x */ GPU プログラミング入門 56

57 実習 1 コンパイラのメッセージを確認しよう acc_compute.f90 or acc_compute.c のソースと コンパイルメッセージを見比べてください コンパイル : $ make acc_compute 注目点 parallel / kernels での違い 間接参照があった際のコンパイラメッセージ acc_kernels_bad_indirect_reference と acc_kernels_indirect_reference の比較 GPU プログラミング入門 57

58 PGI_ACC_TIME による OpenACC 実行の確認 PGI 環境の場合 OpenACC プログラムが実行されているかを確認するには 環境変数 PGI_ACC_TIME を使うのが簡単 使い方 ( 一般的な Linux 環境 またはインタラクティブジョブ実行時 ) $ export PGI_ACC_TIME=1 $ ( プログラムの実行 ) 一般的なスパコン環境では ジョブの中で環境変数を設定する必要が有る ジョブスクリプト中に書いてある GPU プログラミング入門 58

59 PGI_ACC_TIME による OpenACC 実行の確認 OpenACC_samples を利用 $ qsub acc_compute.sh 実行が終わると以下ができる acc_compute.sh.exxxxx ( 標準エラー出力 ) acc_compute.sh.oxxxxx ( 標準出力 ) $ less acc_compute.sh.exxxxx 40. void acc_kernels(double *A, double *B){ 41. double alpha = 1.0; 42. int i,j; / * A と B 初期化 */ 50. #pragma acc kernels 51. for(j = 0;j < N;j++){ 52. for(i = 0;i < N;i++){ 53. B[i+j*N] = alpha * A[i+j*N]; 54. } 55. } 56. } PGI_ACC_TIME による出力メッセージ Accelerator Kernel Timing data /lustre/pz0108/z30108/openacc_samples/c/acc_compute.c acc_kernels NVIDIA devicenum=0 time(us): 149,101 50: compute region reached 1 time 51: kernel launched 1 time grid: [1] block: [1] 起動したスレッド数 device time(us): total=140,552 max=140,552 min=140,552 avg=140,552 elapsed time(us): total=140,611 max=140,611 min=140,611 avg=140,611 50: data region reached 2 times 50: data copyin transfers: 2 device time(us): total=3,742 max=3,052 min=690 avg=1,871 56: data copyout transfers: 1 device time(us): total=4,807 max=4,807 min=4,807 avg=4,807 GPUプログラミング入門 カーネル実行時間 データ移動の回数 時間 59

60 実習 2 OpenACC プログラムを実行してみよう acc_data.f90 or acc_data.c のソースと コンパイルメッセージを見比べてください コンパイル : $ make acc_data プログラムを実行し PGI_ACC_TIME の出力を確認してください 実行 $ qsub acc_data.sh バッチジョブ実行が終了すると acc_data.sh.oxxxxxx ( 標準出力 ), acc_data.sh.exxxxxx ( 標準エラー出力 ) の 2 ファイルが出来る PGI_ACC_TIME の出力確認 注目点 $ less acc_data.sh.exxxxxx # 標準エラーの方 acc_data_copy, acc_data_copyinout の実行時間の違い GPU プログラミング入門 60

61 実習 3 OpenACC プログラムを作ろう 行列積の OpenACC 化 matmul.f90 または matmul.c を用いる acc_matmul ルーチンに OpenACC 指示文を加えてください 注意 : コンパイラの出力をよく見てください よく見るエラー例 (C): Accelerator restriction: size of the GPU copy of C,B is unknown 出力例 ====== OpenACC matmul program ====== 1024 * 1024 matrix check result...ok elapsed time[sec] : FLOPS[GFlops] : GPU プログラミング入門 61

62 実習 4 OpenACC プログラムを速くしよう 拡散方程式のプログラムの高速化 diffusion.f90 または diffusion.c を用いる 既に OpenACC 化されていますが 実行してみると 出力例 (C) 確認手順 (nx, ny, nz) = (128, 128, 128) elapsed time : (s) flops : (GFlops) throughput : (GB/s) accuracy : e-06 count : 1638 すごく遅い ( 特に C) 1. きちんと並列化されているか? コンパイラメッセージ 2. 無駄にデータ転送してないか? PGI_ACC_TIME 3. どっちも OK だけどなお遅い? NVIDIA Visual Profiler (nvvp) に詳細資料あり GPU プログラミング入門 62

CUDA 連携とライブラリの活用 2

CUDA 連携とライブラリの活用 2 1 09:30-10:00 受付 10:00-12:00 Reedbush-H ログイン GPU 入門 13:30-15:00 OpenACC 入門 15:15-16:45 OpenACC 最適化入門と演習 17:00-18:00 OpenACC の活用 (CUDA 連携とライブラリの活用 ) CUDA 連携とライブラリの活用 2 3 OpenACC 簡単にGPUプログラムが作成できる それなりの性能が得られる

More information

第12回講義(2019年7月17日)

第12回講義(2019年7月17日) スパコンプログラミング (1)(Ⅰ) 1 OpenACC の紹介 Reedbush-H お試し 東京大学情報基盤センター准教授塙敏博 2019 年 7 月 17 日 ( 水 )10:25 12:10 2019/7/16 スパコンプログラミング (1) (Ⅰ) 講義日程 ( 工学部共通科目 ) 1. 4 月 9 日 : ガイダンス 2. 4 月 16 日 l 並列数値処理の基本演算 ( 座学 ) 3.

More information

OpenACCによる並列化

OpenACCによる並列化 実習 OpenACC による ICCG ソルバーの並列化 1 ログイン Reedbush へのログイン $ ssh reedbush.cc.u-tokyo.ac.jp l txxxxx Module のロード $ module load pgi/17.3 cuda ログインするたびに必要です! ワークディレクトリに移動 $ cdw ターゲットプログラム /srcx OpenACC 用のディレクトリの作成

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション 1 サンプルソースコードは ITO の /home/tmp/gpu 以下に置いてあります 実質的に 演習の答え となるものもあるので注意 PGI compiler 19.4 で実行した場合の出力に準拠 18.10 でも 19.4 でも基本的には同じであるが 18.10 では出力されていた Accelerator kernel generated ( 並列実行カーネルが作成できた旨 ) が出力されなくなったことを反映

More information

OpenACC入門

OpenACC入門 第 87 回 OpenMP/OpenACC による マルチコア メニィコア並列プログラミング 入門 星野哲也 (hoshino@cc.u-tokyo.ac.jp) 東京大学情報基盤センター 2017/11/1 ( 水 ) スケジュール (11 月 1 日 ) 13:00 14:30 GPUについて GPUのアーキテクチャ GPUプログラミングで気をつけるべきこと OpenACC OpenMPとOpenACCの違い

More information

GPU チュートリアル :OpenACC 篇 Himeno benchmark を例題として 高エネルギー加速器研究機構 (KEK) 松古栄夫 (Hideo Matsufuru) 1 December 2018 HPC-Phys 理化学研究所 共通コードプロジェクト

GPU チュートリアル :OpenACC 篇 Himeno benchmark を例題として 高エネルギー加速器研究機構 (KEK) 松古栄夫 (Hideo Matsufuru) 1 December 2018 HPC-Phys 理化学研究所 共通コードプロジェクト GPU チュートリアル :OpenACC 篇 Himeno benchmark を例題として 高エネルギー加速器研究機構 (KEK) 松古栄夫 (Hideo Matsufuru) 1 December 2018 HPC-Phys 勉強会 @ 理化学研究所 共通コードプロジェクト Contents Hands On 環境について Introduction to GPU computing Introduction

More information

スライド 1

スライド 1 GTC Japan 2013 PGI Accelerator Compiler 新 OpenACC 2.0 の機能と PGI アクセラレータコンパイラ 2013 年 7 月 加藤努株式会社ソフテック 本日の話 OpenACC ディレクティブで出来ることを改めて知ろう! OpenACC 1.0 の復習 ディレクティブ操作で出来ることを再確認 OpenACC 2.0 の新機能 プログラミングの自由度の向上へ

More information

CUDA を用いた画像処理 画像処理を CUDA で並列化 基本的な並列化の考え方 目標 : 妥当な Naïve コードが書ける 最適化の初歩がわかる ブロックサイズ メモリアクセスパターン

CUDA を用いた画像処理 画像処理を CUDA で並列化 基本的な並列化の考え方 目標 : 妥当な Naïve コードが書ける 最適化の初歩がわかる ブロックサイズ メモリアクセスパターン CUDA 画像処理入門 エヌビディアジャパン CUDA エンジニア森野慎也 GTC Japan 2014 CUDA を用いた画像処理 画像処理を CUDA で並列化 基本的な並列化の考え方 目標 : 妥当な Naïve コードが書ける 最適化の初歩がわかる ブロックサイズ メモリアクセスパターン RGB Y( 輝度 ) 変換 カラー画像から グレイスケールへの変換 Y = 0.299 R + 0.587

More information

TSUBAME2.0 における GPU の 活用方法 東京工業大学学術国際情報センター丸山直也第 10 回 GPU コンピューティング講習会 2011 年 9 月 28 日

TSUBAME2.0 における GPU の 活用方法 東京工業大学学術国際情報センター丸山直也第 10 回 GPU コンピューティング講習会 2011 年 9 月 28 日 TSUBAME2.0 における GPU の 活用方法 東京工業大学学術国際情報センター丸山直也第 10 回 GPU コンピューティング講習会 2011 年 9 月 28 日 目次 1. TSUBAMEのGPU 環境 2. プログラム作成 3. プログラム実行 4. 性能解析 デバッグ サンプルコードは /work0/gsic/seminars/gpu- 2011-09- 28 からコピー可能です 1.

More information

Slides: TimeGraph: GPU Scheduling for Real-Time Multi-Tasking Environments

Slides: TimeGraph: GPU Scheduling for Real-Time Multi-Tasking Environments 計算機アーキテクチャ第 11 回 マルチプロセッサ 本資料は授業用です 無断で転載することを禁じます 名古屋大学 大学院情報科学研究科 准教授加藤真平 デスクトップ ジョブレベル並列性 スーパーコンピュータ 並列処理プログラム プログラムの並列化 for (i = 0; i < N; i++) { x[i] = a[i] + b[i]; } プログラムの並列化 x[0] = a[0] + b[0];

More information

OpenACC

OpenACC 109 OpenMP/OpenACC, hoshino @ cc.u-tokyo.ac.jp nakajima @ cc.u-tokyo.ac.jp 1 n Reedbush n $ ssh -Y reedbush.cc.u-tokyo.ac.jp l txxxxx n module n $ module load pgi/18.7 # n n $ cdw n OpenACC_samples n $

More information

Slide 1

Slide 1 CUDA プログラミングの基本 パート II - カーネル CUDA の基本の概要 パート I CUDAのソフトウェアスタックとコンパイル GPUのメモリ管理 パート II カーネルの起動 GPUコードの具体像 注 : 取り上げているのは基本事項のみです そのほか多数の API 関数についてはプログラミングガイドを ご覧ください GPU 上でのコードの実行 カーネルは C 関数 + 多少の制約 ホストメモリはアクセスできない戻り値型は

More information

1. GPU コンピューティング GPU コンピューティング GPUによる 汎用コンピューティング GPU = Graphics Processing Unit CUDA Compute Unified Device Architecture NVIDIA の GPU コンピューティング環境 Lin

1. GPU コンピューティング GPU コンピューティング GPUによる 汎用コンピューティング GPU = Graphics Processing Unit CUDA Compute Unified Device Architecture NVIDIA の GPU コンピューティング環境 Lin Windows で始める CUDA 入門 GTC 2013 チュートリアル エヌビディアジャパン CUDA エンジニア森野慎也 1. GPU コンピューティング GPU コンピューティング GPUによる 汎用コンピューティング GPU = Graphics Processing Unit CUDA Compute Unified Device Architecture NVIDIA の GPU コンピューティング環境

More information

HPC143

HPC143 研究背景 GPUクラスタ 高性能 高いエネルギー効率 低価格 様々なHPCアプリケーションで用いられている TCA (Tightly Coupled Accelerators) 密結合並列演算加速機構 筑波大学HA-PACSクラスタ アクセラレータ GPU 間の直接通信 低レイテンシ 今後のHPCアプリは強スケーリングも重要 TCAとアクセラレータを搭載したシステムに おけるプログラミングモデル 例

More information

概要 目的 CUDA Fortran の利用に関する基本的なノウハウを提供する 本チュートリアル受講後は Web 上で公開されている資料等を参照しながら独力で CUDA Fortran が利用できることが目標 対象 CUDA Fortran の利用に興味を抱いている方 前提とする知識 Fortran

概要 目的 CUDA Fortran の利用に関する基本的なノウハウを提供する 本チュートリアル受講後は Web 上で公開されている資料等を参照しながら独力で CUDA Fortran が利用できることが目標 対象 CUDA Fortran の利用に興味を抱いている方 前提とする知識 Fortran CUDA Fortran チュートリアル 2010 年 9 月 29 日 NEC 概要 目的 CUDA Fortran の利用に関する基本的なノウハウを提供する 本チュートリアル受講後は Web 上で公開されている資料等を参照しながら独力で CUDA Fortran が利用できることが目標 対象 CUDA Fortran の利用に興味を抱いている方 前提とする知識 Fortran を用いた Linux

More information

Microsoft PowerPoint - GTC2012-SofTek.pptx

Microsoft PowerPoint - GTC2012-SofTek.pptx GTC Japan 2012 PGI Accelerator Compiler 実践! PGI OpenACC ディレクティブを使用したポーティング 2012 年 7 月 加藤努株式会社ソフテック 本日の話 OpenACC によるポーティングの実際 OpenACC ディレクティブ概略説明 Accelerator Programming Model Fortran プログラムによるポーティング ステップ三つのディレクティブの利用性能チューニング

More information

GPU CUDA CUDA 2010/06/28 1

GPU CUDA CUDA 2010/06/28 1 GPU CUDA CUDA 2010/06/28 1 GPU NVIDIA Mark Harris, Optimizing Parallel Reduction in CUDA http://developer.download.nvidia.com/ compute/cuda/1_1/website/data- Parallel_Algorithms.html#reduction CUDA SDK

More information

演習1: 演習準備

演習1: 演習準備 演習 1: 演習準備 2013 年 8 月 6 日神戸大学大学院システム情報学研究科森下浩二 1 演習 1 の内容 神戸大 X10(π-omputer) について システム概要 ログイン方法 コンパイルとジョブ実行方法 OpenMP の演習 ( 入門編 ) 1. parallel 構文 実行時ライブラリ関数 2. ループ構文 3. shared 節 private 節 4. reduction 節

More information

Microsoft PowerPoint - GDEP-GPG_softek_May24-2.pptx

Microsoft PowerPoint - GDEP-GPG_softek_May24-2.pptx G-DEP 第 3 回セミナー PGI OpenACC Compiler PGIコンパイラ使用の実際 新しい OpenACC によるプログラミング 2012 年 5 月 加藤努株式会社ソフテック OpenACC によるプログラミング GPU / Accelerator Computing Model のデファクト スタンダードへ OpenACC Standard 概略説明 Accelerator Programming

More information

XACCの概要

XACCの概要 2 global void kernel(int a[max], int llimit, int ulimit) {... } : int main(int argc, char *argv[]){ MPI_Int(&argc, &argc); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); dx

More information

Microsoft Word - openmp-txt.doc

Microsoft Word - openmp-txt.doc ( 付録 A) OpenMP チュートリアル OepnMP は 共有メモリマルチプロセッサ上のマルチスレッドプログラミングのための API です 本稿では OpenMP の簡単な解説とともにプログラム例をつかって説明します 詳しくは OpenMP の規約を決めている OpenMP ARB の http://www.openmp.org/ にある仕様書を参照してください 日本語訳は http://www.hpcc.jp/omni/spec.ja/

More information

XMPによる並列化実装2

XMPによる並列化実装2 2 3 C Fortran Exercise 1 Exercise 2 Serial init.c init.f90 XMP xmp_init.c xmp_init.f90 Serial laplace.c laplace.f90 XMP xmp_laplace.c xmp_laplace.f90 #include int a[10]; program init integer

More information

TSUBAME2.0におけるGPUの 活用方法

TSUBAME2.0におけるGPUの 活用方法 GPU プログラミング 基礎編 東京工業大学学術国際情報センター 1. GPU コンピューティングと TSUBAME2.0 スーパーコンピュータ GPU コンピューティングとは グラフィックプロセッサ (GPU) は グラフィック ゲームの画像計算のために 進化を続けてきた 現在 CPU のコア数は 2~12 個に対し GPU 中には数百コア その GPU を一般アプリケーションの高速化に利用! GPGPU

More information

Slide 1

Slide 1 CUDA プログラミングの基本 パート I - ソフトウェアスタックとメモリ管理 CUDA の基本の概要 パート I CUDAのソフトウェアスタックとコンパイル GPUのメモリ管理 パートII カーネルの起動 GPUコードの具体項目 注 : 取り上げているのは基本事項のみです そのほか多数の API 関数についてはプログラミングガイドを ご覧ください CUDA インストレーション CUDA インストレーションの構成

More information

3次多項式パラメタ推定計算の CUDAを用いた実装 (CUDAプログラミングの練習として) Implementation of the Estimation of the parameters of 3rd-order-Polynomial with CUDA

3次多項式パラメタ推定計算の CUDAを用いた実装 (CUDAプログラミングの練習として)  Implementation of the Estimation of the parameters of 3rd-order-Polynomial with CUDA 3 次多項式パラメタ推定計算の CUDA を用いた実装 (CUDA プログラミングの練習として ) Estimating the Parameters of 3rd-order-Polynomial with CUDA ISS 09/11/12 問題の選択 目的 CUDA プログラミングを経験 ( 試行錯誤と習得 ) 実際に CPU のみの場合と比べて高速化されることを体験 問題 ( インプリメントする内容

More information

NUMAの構成

NUMAの構成 GPU のプログラム 天野 アクセラレータとは? 特定の性質のプログラムを高速化するプロセッサ 典型的なアクセラレータ GPU(Graphic Processing Unit) Xeon Phi FPGA(Field Programmable Gate Array) 最近出て来た Deep Learning 用ニューロチップなど Domain Specific Architecture 1GPGPU:General

More information

Vol.214-HPC-145 No /7/3 C #pragma acc directive-name [clause [[,] clause] ] new-line structured block Fortran!$acc directive-name [clause [[,] c

Vol.214-HPC-145 No /7/3 C #pragma acc directive-name [clause [[,] clause] ] new-line structured block Fortran!$acc directive-name [clause [[,] c Vol.214-HPC-145 No.45 214/7/3 OpenACC 1 3,1,2 1,2 GPU CUDA OpenCL OpenACC OpenACC High-level OpenACC CPU Intex Xeon Phi K2X GPU Intel Xeon Phi 27% K2X GPU 24% 1. TSUBAME2.5 CPU GPU CUDA OpenCL CPU OpenMP

More information

熊本大学学術リポジトリ Kumamoto University Repositor Title GPGPU による高速演算について Author(s) 榎本, 昌一 Citation Issue date Type URL Presentation

熊本大学学術リポジトリ Kumamoto University Repositor Title GPGPU による高速演算について Author(s) 榎本, 昌一 Citation Issue date Type URL Presentation 熊本大学学術リポジトリ Kumamoto University Repositor Title GPGPU による高速演算について Author(s) 榎本, 昌一 Citation Issue date 2011-03-17 Type URL Presentation http://hdl.handle.net/2298/23539 Right GPGPU による高速演算について 榎本昌一 東京大学大学院工学系研究科システム創成学専攻

More information

07-二村幸孝・出口大輔.indd

07-二村幸孝・出口大輔.indd GPU Graphics Processing Units HPC High Performance Computing GPU GPGPU General-Purpose computation on GPU CPU GPU GPU *1 Intel Quad-Core Xeon E5472 3.0 GHz 2 6 MB L2 cache 1600 MHz FSB 80 GFlops 1 nvidia

More information

ストリームを用いたコンカレントカーネルプログラミングと最適化 エヌビディアジャパン CUDAエンジニア森野慎也 GTC Japan 2014

ストリームを用いたコンカレントカーネルプログラミングと最適化 エヌビディアジャパン CUDAエンジニア森野慎也 GTC Japan 2014 ストリームを用いたコンカレントカーネルプログラミングと最適化 エヌビディアジャパン CUDAエンジニア森野慎也 GTC Japan 2014 コンカレントな処理の実行 システム内部の複数の処理を 平行に実行する CPU GPU メモリ転送 カーネル実行 複数のカーネル間 ストリーム GPU 上の処理キュー カーネル実行 メモリ転送の並列性 実行順序 DEFAULT STREAM Stream : GPU

More information

Microsoft PowerPoint - 03_What is OpenMP 4.0 other_Jan18

Microsoft PowerPoint - 03_What is OpenMP 4.0 other_Jan18 OpenMP* 4.x における拡張 OpenMP 4.0 と 4.5 の機能拡張 内容 OpenMP* 3.1 から 4.0 への拡張 OpenMP* 4.0 から 4.5 への拡張 2 追加された機能 (3.1 -> 4.0) C/C++ 配列シンタックスの拡張 SIMD と SIMD 対応関数 デバイスオフロード task 構 の依存性 taskgroup 構 cancel 句と cancellation

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション 講座準備 講座資料は次の URL から DL 可能 https://goo.gl/jnrfth 1 ポインタ講座 2017/01/06,09 fumi 2 はじめに ポインタはC 言語において理解が難しいとされる そのポインタを理解することを目的とする 講座は1 日で行うので 詳しいことは調べること 3 はじめに みなさん復習はしましたか? 4 & 演算子 & 演算子を使うと 変数のアドレスが得られる

More information

NUMAの構成

NUMAの構成 共有メモリを使ったデータ交換と同期 慶應義塾大学理工学部 天野英晴 hunga@am.ics.keio.ac.jp 同期の必要性 あるプロセッサが共有メモリに書いても 別のプロセッサにはそのことが分からない 同時に同じ共有変数に書き込みすると 結果がどうなるか分からない そもそも共有メモリって結構危険な代物 多くのプロセッサが並列に動くには何かの制御機構が要る 不可分命令 同期用メモリ バリア同期機構

More information

memo

memo 計数工学プログラミング演習 ( 第 3 回 ) 2017/04/25 DEPARTMENT OF MATHEMATICAL INFORMATICS 1 内容 ポインタの続き 引数の値渡しと参照渡し 構造体 2 ポインタで指されるメモリへのアクセス double **R; 型 R[i] と *(R+i) は同じ意味 意味 R double ** ポインタの配列 ( の先頭 ) へのポインタ R[i]

More information

コードのチューニング

コードのチューニング OpenMP による並列化実装 八木学 ( 理化学研究所計算科学研究センター ) KOBE HPC Spring School 2019 2019 年 3 月 14 日 スレッド並列とプロセス並列 スレッド並列 OpenMP 自動並列化 プロセス並列 MPI プロセス プロセス プロセス スレッドスレッドスレッドスレッド メモリ メモリ プロセス間通信 Private Private Private

More information

memo

memo 数理情報工学演習第一 C プログラミング演習 ( 第 5 回 ) 2015/05/11 DEPARTMENT OF MATHEMATICAL INFORMATICS 1 今日の内容 : プロトタイプ宣言 ヘッダーファイル, プログラムの分割 課題 : 疎行列 2 プロトタイプ宣言 3 C 言語では, 関数や変数は使用する前 ( ソースの上のほう ) に定義されている必要がある. double sub(int

More information

DO 時間積分 START 反変速度の計算 contravariant_velocity 移流項の計算 advection_adams_bashforth_2nd DO implicit loop( 陰解法 ) 速度勾配, 温度勾配の計算 gradient_cell_center_surface 速

DO 時間積分 START 反変速度の計算 contravariant_velocity 移流項の計算 advection_adams_bashforth_2nd DO implicit loop( 陰解法 ) 速度勾配, 温度勾配の計算 gradient_cell_center_surface 速 1 1, 2 1, 2 3 2, 3 4 GP LES ASUCA LES NVIDIA CUDA LES 1. Graphics Processing Unit GP General-Purpose SIMT Single Instruction Multiple Threads 1 2 3 4 1),2) LES Large Eddy Simulation 3) ASUCA 4) LES LES

More information

01_OpenMP_osx.indd

01_OpenMP_osx.indd OpenMP* / 1 1... 2 2... 3 3... 5 4... 7 5... 9 5.1... 9 5.2 OpenMP* API... 13 6... 17 7... 19 / 4 1 2 C/C++ OpenMP* 3 Fortran OpenMP* 4 PC 1 1 9.0 Linux* Windows* Xeon Itanium OS 1 2 2 WEB OS OS OS 1 OS

More information

( CUDA CUDA CUDA CUDA ( NVIDIA CUDA I

(    CUDA CUDA CUDA CUDA (  NVIDIA CUDA I GPGPU (II) GPGPU CUDA 1 GPGPU CUDA(CUDA Unified Device Architecture) CUDA NVIDIA GPU *1 C/C++ (nvcc) CUDA NVIDIA GPU GPU CUDA CUDA 1 CUDA CUDA 2 CUDA NVIDIA GPU PC Windows Linux MaxOSX CUDA GPU CUDA NVIDIA

More information

概要 プログラミング論 変数のスコープ, 記憶クラス. メモリ動的確保. 変数のスコープ 重要. おそらく簡単. 記憶クラス 自動変数 (auto) と静的変数 (static). スコープほどではないが重要.

概要 プログラミング論 変数のスコープ, 記憶クラス. メモリ動的確保. 変数のスコープ 重要. おそらく簡単. 記憶クラス 自動変数 (auto) と静的変数 (static). スコープほどではないが重要. 概要 プログラミング論 変数のスコープ, 記憶クラス. メモリ動的確保. 変数のスコープ 重要. おそらく簡単. 記憶クラス 自動変数 (auto) と静的変数 (static). スコープほどではないが重要. http://www.ns.kogakuin.ac.jp/~ct13140/progc/ C-2 ブロック 変数のスコープ C 言語では, から をブロックという. for( ) if( )

More information

OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£±¡Ë

OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£±¡Ë 2012 5 24 scalar Open MP Hello World Do (omp do) (omp workshare) (shared, private) π (reduction) PU PU PU 2 16 OpenMP FORTRAN/C/C++ MPI OpenMP 1997 FORTRAN Ver. 1.0 API 1998 C/C++ Ver. 1.0 API 2000 FORTRAN

More information

openmp1_Yaguchi_version_170530

openmp1_Yaguchi_version_170530 並列計算とは /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

More information

<4D F736F F F696E74202D D F95C097F D834F E F93FC96E5284D F96E291E85F8DE391E52E >

<4D F736F F F696E74202D D F95C097F D834F E F93FC96E5284D F96E291E85F8DE391E52E > SX-ACE 並列プログラミング入門 (MPI) ( 演習補足資料 ) 大阪大学サイバーメディアセンター日本電気株式会社 演習問題の構成 ディレクトリ構成 MPI/ -- practice_1 演習問題 1 -- practice_2 演習問題 2 -- practice_3 演習問題 3 -- practice_4 演習問題 4 -- practice_5 演習問題 5 -- practice_6

More information

memo

memo 計数工学プログラミング演習 ( 第 3 回 ) 2016/04/26 DEPARTMENT OF MATHEMATICAL INFORMATICS 1 内容 ポインタ malloc 構造体 2 ポインタ あるメモリ領域 ( アドレス ) を代入できる変数 型は一致している必要がある 定義時には値は不定 ( 何も指していない ) 実際にはどこかのメモリを指しているので, #include

More information

XACC講習会

XACC講習会 www.xcalablemp.org 1 4, int array[max]; #pragma xmp nodes p(*) #pragma xmp template t(0:max-1) #pragma xmp distribute t(block) onto p #pragma xmp align array[i] with t(i) int array[max]; main(int argc,

More information

OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£±¡Ë

OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£±¡Ë 2011 5 26 scalar Open MP Hello World Do (omp do) (omp workshare) (shared, private) π (reduction) scalar magny-cours, 48 scalar scalar 1 % scp. ssh / authorized keys 133. 30. 112. 246 2 48 % ssh 133.30.112.246

More information

第9回 配列(array)型の変数

第9回 配列(array)型の変数 第 12 回 配列型の変数 情報処理演習 ( テキスト : 第 4 章, 第 8 章 ) 今日の内容 1. 配列の必要性 2. 配列の宣言 3. 配列変数のイメージ 4. 配列変数を使用した例 5. 範囲を超えた添字を使うと? 6. 多次元配列変数 7. 多次元配列変数を使用した例 8. データのソーティング 9. 今日の練習問題 多数のデータ処理 1. 配列の必要性 ( テキスト 31 ページ )

More information

OpenMPプログラミング

OpenMPプログラミング OpenMP 基礎 岩下武史 ( 学術情報メディアセンター ) 1 2013/9/13 並列処理とは 逐次処理 CPU1 並列処理 CPU1 CPU2 CPU3 CPU4 処理 1 処理 1 処理 2 処理 3 処理 4 処理 2 処理 3 処理 4 時間 2 2 種類の並列処理方法 プロセス並列 スレッド並列 並列プログラム 並列プログラム プロセス プロセス 0 プロセス 1 プロセス間通信 スレッド

More information

並列・高速化を実現するための 高速化サービスの概要と事例紹介

並列・高速化を実現するための 高速化サービスの概要と事例紹介 第 4 回 AVS 可視化フォーラム 2019 並列 高速化を実現するための 高速化サービスの概要と事例紹介 株式会社アーク情報システム営業部仮野亮ソリューション技術部佐々木竜一 2019.08.30 はじめに アーク情報システムの紹介 高速化サービスとは? 事例紹介 コンサルティングサービスについて アーク情報システムの紹介 設立 資本金 :1987 年 10 月 :3 億 600 万円 従業員数

More information

Microsoft PowerPoint - OpenMP入門.pptx

Microsoft PowerPoint - OpenMP入門.pptx OpenMP 入門 須田礼仁 2009/10/30 初版 OpenMP 共有メモリ並列処理の標準化 API http://openmp.org/ 最新版は 30 3.0 バージョンによる違いはあまり大きくない サポートしているバージョンはともかく csp で動きます gcc も対応しています やっぱり SPMD Single Program Multiple Data プログラム #pragma omp

More information

IPSJ SIG Technical Report Vol.2013-HPC-138 No /2/21 GPU CRS 1,a) 2,b) SpMV GPU CRS SpMV GPU NVIDIA Kepler CUDA5.0 Fermi GPU Kepler Kepler Tesla

IPSJ SIG Technical Report Vol.2013-HPC-138 No /2/21 GPU CRS 1,a) 2,b) SpMV GPU CRS SpMV GPU NVIDIA Kepler CUDA5.0 Fermi GPU Kepler Kepler Tesla GPU CRS 1,a),b) SpMV GPU CRS SpMV GPU NVIDIA Kepler CUDA5.0 Fermi GPU Kepler Kepler Tesla K0 CUDA5.0 cusparse CRS SpMV 00 1.86 177 1. SpMV SpMV CRS Compressed Row Storage *1 SpMV GPU GPU NVIDIA Kepler

More information

Microsoft PowerPoint - 09.pptx

Microsoft PowerPoint - 09.pptx 情報処理 Ⅱ 第 9 回 2014 年 12 月 22 日 ( 月 ) 関数とは なぜ関数 関数の分類 自作関数 : 自分で定義する. ユーザ関数 ユーザ定義関数 などともいう. 本日のテーマ ライブラリ関数 : 出来合いのもの.printf など. なぜ関数を定義するのか? 処理を共通化 ( 一般化 ) する プログラムの見通しをよくする 機能分割 ( モジュール化, 再利用 ) 責任 ( あるいは不具合の発生源

More information

プログラミング実習I

プログラミング実習I プログラミング実習 I 05 関数 (1) 人間システム工学科井村誠孝 m.imura@kwansei.ac.jp 関数とは p.162 数学的には入力に対して出力が決まるもの C 言語では入出力が定まったひとまとまりの処理 入力や出力はあるときもないときもある main() も関数の一種 何かの仕事をこなしてくれる魔法のブラックボックス 例 : printf() 関数中で行われている処理の詳細を使う側は知らないが,

More information

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1 7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 10001 番地とすると, そこから int 型のサイズ, つまり 4 バイト分の領域が確保される.1

More information

Microsoft PowerPoint - ca ppt [互換モード]

Microsoft PowerPoint - ca ppt [互換モード] 大阪電気通信大学情報通信工学部光システム工学科 2 年次配当科目 コンピュータアルゴリズム 良いアルゴリズムとは 第 2 講 : 平成 20 年 10 月 10 日 ( 金 ) 4 限 E252 教室 中村嘉隆 ( なかむらよしたか ) 奈良先端科学技術大学院大学助教 y-nakamr@is.naist.jp http://narayama.naist.jp/~y-nakamr/ 第 1 講の復習

More information

Microsoft PowerPoint - 演習1:並列化と評価.pptx

Microsoft PowerPoint - 演習1:並列化と評価.pptx 講義 2& 演習 1 プログラム並列化と性能評価 神戸大学大学院システム情報学研究科横川三津夫 yokokawa@port.kobe-u.ac.jp 2014/3/5 RIKEN AICS HPC Spring School 2014: プログラム並列化と性能評価 1 2014/3/5 RIKEN AICS HPC Spring School 2014: プログラム並列化と性能評価 2 2 次元温度分布の計算

More information

Slide 1

Slide 1 OpenACC CUDA による GPU コンピューティング Akira Naruse, 19 th Jul. 2018 成瀬彰 (Naruse, Akira) 自己紹介 2013 年 ~: NVIDIA シニア デベローパーテクノロジー エンジニア 1996~2013 年 : 富士通研究所 研究員など 専門 興味 : 並列処理 性能最適化 スパコン HPC GPU コンピューティング DeepLearning

More information

Slide 1

Slide 1 GPUコンピューティング入門 2015.08.26 エヌビディア合同会社 CUDAエンジニア 村上真奈 エヌビディアのGPUについて (20 分 ) GPUコンピューティングとは?(10 分 ) OpenACC 入門 (90 分 ) CUDA 入門 (90 分 ) Agenda 2 エヌビディアのGPUについて (20 分 ) GPUコンピューティングとは?(10 分 ) OpenACC 入門 (90

More information

(Microsoft PowerPoint \215u\213`4\201i\221\272\210\344\201j.pptx)

(Microsoft PowerPoint \215u\213`4\201i\221\272\210\344\201j.pptx) AICS 村井均 RIKEN AICS HPC Summer School 2012 8/7/2012 1 背景 OpenMP とは OpenMP の基本 OpenMP プログラミングにおける注意点 やや高度な話題 2 共有メモリマルチプロセッサシステムの普及 共有メモリマルチプロセッサシステムのための並列化指示文を共通化する必要性 各社で仕様が異なり 移植性がない そして いまやマルチコア プロセッサが主流となり

More information

memo

memo 計数工学プログラミング演習 ( 第 4 回 ) 2016/05/10 DEPARTMENT OF MATHEMATICA INFORMATICS 1 内容 リスト 疎行列 2 連結リスト (inked ists) オブジェクトをある線形順序に並べて格納するデータ構造 単方向連結リスト (signly linked list) の要素 x キーフィールド key ポインタフィールド next x->next:

More information

Microsoft PowerPoint - sales2.ppt

Microsoft PowerPoint - sales2.ppt 最適化とは何? CPU アーキテクチャに沿った形で最適な性能を抽出できるようにする技法 ( 性能向上技法 ) コンパイラによるプログラム最適化 コンパイラメーカの技量 経験量に依存 最適化ツールによるプログラム最適化 KAP (Kuck & Associates, Inc. ) 人によるプログラム最適化 アーキテクチャのボトルネックを知ること 3 使用コンパイラによる性能の違い MFLOPS 90

More information

メソッドのまとめ

メソッドのまとめ 配列 (2) 2 次元配列, String http://jv2005.cis.k.hosei.c.jp/ 授業の前に自己点検 配列変数に格納される配列の ID と配列の実体の区別ができていますか 配列変数の宣言と配列の実体の生成の区別ができていますか メソッドの引数に配列が渡されるとき 実際に渡されるものは何ですか このことの重要な帰結は何ですか 引数の値渡しと参照渡しということばを例を挙げて説明できますか

More information

HPC146

HPC146 2 3 4 5 6 int array[16]; #pragma xmp nodes p(4) #pragma xmp template t(0:15) #pragma xmp distribute t(block) on p #pragma xmp align array[i] with t(i) array[16] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Node

More information

メソッドのまとめ

メソッドのまとめ メソッド (4) 擬似コードテスト技法 http://java.cis.k.hosei.ac.jp/ 授業の前に自己点検以下のことがらを友達に説明できますか? メソッドの宣言とは 起動とは何ですか メソッドの宣言はどのように書きますか メソッドの宣言はどこに置きますか メソッドの起動はどのようにしますか メソッドの仮引数 実引数 戻り値とは何ですか メソッドの起動にあたって実引数はどのようにして仮引数に渡されますか

More information

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド メソッド ( 教科書第 7 章 p.221~p.239) ここまでには文字列を表示する System.out.print() やキーボードから整数を入力する stdin.nextint() などを用いてプログラムを作成してきた これらはメソッドと呼ばれるプログラムを構成する部品である メソッドとは Java や C++ などのオブジェクト指向プログラミング言語で利用されている概念であり 他の言語での関数やサブルーチンに相当するが

More information

OpenMP (1) 1, 12 1 UNIX (FUJITSU GP7000F model 900), 13 1 (COMPAQ GS320) FUJITSU VPP5000/64 1 (a) (b) 1: ( 1(a))

OpenMP (1) 1, 12 1 UNIX (FUJITSU GP7000F model 900), 13 1 (COMPAQ GS320) FUJITSU VPP5000/64 1 (a) (b) 1: ( 1(a)) OpenMP (1) 1, 12 1 UNIX (FUJITSU GP7000F model 900), 13 1 (COMPAQ GS320) FUJITSU VPP5000/64 1 (a) (b) 1: ( 1(a)) E-mail: {nanri,amano}@cc.kyushu-u.ac.jp 1 ( ) 1. VPP Fortran[6] HPF[3] VPP Fortran 2. MPI[5]

More information

02_C-C++_osx.indd

02_C-C++_osx.indd C/C++ OpenMP* / 2 C/C++ OpenMP* OpenMP* 9.0 1... 2 2... 3 3OpenMP*... 5 3.1... 5 3.2 OpenMP*... 6 3.3 OpenMP*... 8 4OpenMP*... 9 4.1... 9 4.2 OpenMP*... 9 4.3 OpenMP*... 10 4.4... 10 5OpenMP*... 11 5.1

More information

情報処理概論(第二日目)

情報処理概論(第二日目) 情報処理概論 工学部物質科学工学科応用化学コース機能物質化学クラス 第 8 回 2005 年 6 月 9 日 前回の演習の解答例 多項式の計算 ( 前半 ): program poly implicit none integer, parameter :: number = 5 real(8), dimension(0:number) :: a real(8) :: x, total integer

More information

1 OpenCL OpenCL 1 OpenCL GPU ( ) 1 OpenCL Compute Units Elements OpenCL OpenCL SPMD (Single-Program, Multiple-Data) SPMD OpenCL work-item work-group N

1 OpenCL OpenCL 1 OpenCL GPU ( ) 1 OpenCL Compute Units Elements OpenCL OpenCL SPMD (Single-Program, Multiple-Data) SPMD OpenCL work-item work-group N GPU 1 1 2 1, 3 2, 3 (Graphics Unit: GPU) GPU GPU GPU Evaluation of GPU Computing Based on An Automatic Program Generation Technology Makoto Sugawara, 1 Katsuto Sato, 1 Kazuhiko Komatsu, 2 Hiroyuki Takizawa

More information

GPU GPU CPU CPU CPU GPU GPU N N CPU ( ) 1 GPU CPU GPU 2D 3D CPU GPU GPU GPGPU GPGPU 2 nvidia GPU CUDA 3 GPU 3.1 GPU Core 1

GPU GPU CPU CPU CPU GPU GPU N N CPU ( ) 1 GPU CPU GPU 2D 3D CPU GPU GPU GPGPU GPGPU 2 nvidia GPU CUDA 3 GPU 3.1 GPU Core 1 GPU 4 2010 8 28 1 GPU CPU CPU CPU GPU GPU N N CPU ( ) 1 GPU CPU GPU 2D 3D CPU GPU GPU GPGPU GPGPU 2 nvidia GPU CUDA 3 GPU 3.1 GPU Core 1 Register & Shared Memory ( ) CPU CPU(Intel Core i7 965) GPU(Tesla

More information

Microsoft PowerPoint - GPUシンポジウム _d公開版.ppt [互換モード]

Microsoft PowerPoint - GPUシンポジウム _d公開版.ppt [互換モード] 200/0/9 数値流体解析の並列効率とその GPU による高速化の試み 清水建設 ( 株 ) 技術研究所 PHAM VAN PHUC ( ファムバンフック ) 流体計算時間短縮と GPU の活用の試み 現 CPUとの比較によりGPU 活用の可能性 現 CPU の最大利用 ノード内の最大計算資源の利用 すべてCPUコアの利用 適切なアルゴリズムの利用 CPU コア性能の何倍? GPU の利用の試み

More information

Microsoft PowerPoint - 計算機言語 第7回.ppt

Microsoft PowerPoint - 計算機言語 第7回.ppt 計算機言語第 7 回 長宗高樹 目的 関数について理解する. 入力 X 関数 f 出力 Y Y=f(X) 関数の例 関数の型 #include int tasu(int a, int b); main(void) int x1, x2, y; x1 = 2; x2 = 3; y = tasu(x1,x2); 実引数 printf( %d + %d = %d, x1, x2, y);

More information

untitled

untitled GPGPU NVIDACUDA Learn More about CUDA - NVIDIA http://www.nvidia.co.jp/object/cuda_education_jp.html NVIDIA CUDA programming Guide CUDA http://www.sintef.no/upload/ikt/9011/simoslo/evita/2008/seland.pdf

More information

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx GPU のプログラム構造 長岡技術科学大学電気電子情報工学専攻出川智啓 今回の内容 GPU プログラミング環境 (CUDA) GPU プログラムの実行の流れ CUDA によるプログラムの記述 カーネル (GPU で処理する関数 ) の構造 記述方法とその理由 GPU 固有のパラメータの確認 405 GPU(Graphics Processing Unit) とは 画像処理専用のハードウェア 具体的には画像処理用のチップ

More information

インテル(R) Visual Fortran Composer XE 2013 Windows版 入門ガイド

インテル(R) Visual Fortran Composer XE 2013 Windows版 入門ガイド Visual Fortran Composer XE 2013 Windows* エクセルソフト株式会社 www.xlsoft.com Rev. 1.1 (2012/12/10) Copyright 1998-2013 XLsoft Corporation. All Rights Reserved. 1 / 53 ... 3... 4... 4... 5 Visual Studio... 9...

More information

ex04_2012.ppt

ex04_2012.ppt 2012 年度計算機システム演習第 4 回 2012.05.07 第 2 回課題の補足 } TSUBAMEへのログイン } TSUBAMEは学内からのログインはパスワードで可能 } } } } しかし 演習室ではパスワードでログインできない設定 } 公開鍵認証でログイン 公開鍵, 秘密鍵の生成 } ターミナルを開く } $ ssh-keygen } Enter file in which to save

More information

演習1

演習1 神戸市立工業高等専門学校電気工学科 / 電子工学科専門科目 数値解析 2019.5.10 演習 1 山浦剛 (tyamaura@riken.jp) 講義資料ページ http://r-ccs-climate.riken.jp/members/yamaura/numerical_analysis.html Fortran とは? Fortran(= FORmula TRANslation ) は 1950

More information

第8回講義(2016年12月6日)

第8回講義(2016年12月6日) 2016/12/6 スパコンプログラミング (1) (Ⅰ) 1 行列 - 行列積 (2) 東京大学情報基盤センター准教授塙敏博 2016 年 12 月 6 日 ( 火 ) 10:25-12:10 2016/11/29 講義日程 ( 工学部共通科目 ) 1. 9 月 27 日 ( 今日 ): ガイダンス 2. 10 月 4 日 l 並列数値処理の基本演算 ( 座学 ) 3. 10 月 11 日 : スパコン利用開始

More information

Fortran 勉強会 第 5 回 辻野智紀

Fortran 勉強会 第 5 回 辻野智紀 Fortran 勉強会 第 5 回 辻野智紀 今回のお品書き サブルーチンの分割コンパイル ライブラリ 静的ライブラリ 動的ライブラリ モジュール その前に 以下の URL から STPK ライブラリをインストールしておいて下さい. http://www.gfd-dennou.org/library/davis/stpk 前回参加された方はインストール済みのはず. サブルーチンの分割コンパイル サブルーチンの独立化

More information

PowerPoint Presentation

PowerPoint Presentation ヘテロジニアスな環境におけるソフトウェア開発 Agenda 今日の概要 ヘテロジニアスな環境の登場 ホモジニアスからヘテロジニアスへ ヘテロジニアスなアーキテクチャ GPU CUDA OpenACC, XeonPhi 自分のプログラムを理解するために デバッガ 共通の操作体験 TotalView 続きはブースで より速く ホモジーニアスな並列 HPC 銀河生成 金融のリスク計算 車の衝突解析 製薬

More information

gengo1-8

gengo1-8 問題提起その 1 一文字ずつ文字 ( 数字 ) を読み込み それぞれの文字が何回入力されたかを数えて出力するプログラム int code, count_0=0, count_1=0, count_2=0, count_3=0,..., count_9=0; while( (code=getchar())!= EOF ){ } switch(code){ case 0 : count_0++; break;

More information

gengo1-11

gengo1-11 関数の再帰定義 自然数 n の階乗 n! を計算する関数を定義してみる 引数は整数 返却値も整数 n! = 1*2*3*... * (n 1)*n である ただし 0! = 1 とする int factorial(int n) int i, tmp=1; if( n>0 ) for(i=1; i

More information

プログラミングI第10回

プログラミングI第10回 プログラミング 1 第 10 回 構造体 (3) 応用 リスト操作 この資料にあるサンプルプログラムは /home/course/prog1/public_html/2007/hw/lec/sources/ 下に置いてありますから 各自自分のディレクトリにコピーして コンパイル 実行してみてください Prog1 2007 Lec 101 Programming1 Group 19992007 データ構造

More information

1. マシンビジョンにおける GPU の活用

1. マシンビジョンにおける GPU の活用 CUDA 画像処理入門 GTC 213 チュートリアル エヌビディアジャパン CUDA エンジニア森野慎也 1. マシンビジョンにおける GPU の活用 1. 医用画像処理における GPU の活用 CT や MRI から画像を受信して三次元画像の構築をするシステム 2 次元スキャンデータから 3 次元 4 次元イメージの高速生成 CUDA 化により画像処理速度を約 2 倍に高速化 1. CUDA で画像処理

More information

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx GPU のメモリ階層 長岡技術科学大学電気電子情報工学専攻出川智啓 今回の内容 GPU のメモリ階層 グローバルメモリ 共有メモリ モザイク処理への適用 コンスタントメモリ 空間フィルタへの適用 577 GPU の主要部品 基盤 GPU( チップ )+ 冷却部品 画面出力端子 電源入力端子 メモリ 特性の把握が重要 電源入力端子 画面出力端子 メモリ チップ PCI Ex 端子 http://www.geforce.com/whats

More information

Microsoft Word - Training10_プリプロセッサ.docx

Microsoft Word - Training10_プリプロセッサ.docx Training 10 プリプロセッサ 株式会社イーシーエス出版事業推進委員会 1 Lesson1 マクロ置換 Point マクロ置換を理解しよう!! マクロ置換の機能により 文字列の置き換えをすることが出来ます プログラムの可読性と保守性 ( メンテナンス性 ) を高めることができるため よく用いられます マクロ置換で値を定義しておけば マクロの値を変更するだけで 同じマクロを使用したすべての箇所が変更ができるので便利です

More information

Microsoft Word - COMP-MATH-2016-FULLTEXT.doc

Microsoft Word - COMP-MATH-2016-FULLTEXT.doc #13 2017/1/17 16 連立一次方程式を解くその 2 1) 対角線上に 0 が現れる場合を回避する 0x + 3y = 9 2x + 4y = 16 これを kadai-26 で解いてみなさい 以下のようにエラーになる 0.00000000 3.00000000 9.00000000 2.00000000 4.00000000 16.00000000-1.#IND0000-1.#IND0000-1.#IND0000-1.#IND0000-1.#IND0000-1.#IND0000

More information

1 4 1.1........................................... 4 1.2.................................. 4 1.3................................... 4 2 5 2.1 GPU.....

1 4 1.1........................................... 4 1.2.................................. 4 1.3................................... 4 2 5 2.1 GPU..... CPU GPU N Q07-065 2011 2 17 1 1 4 1.1........................................... 4 1.2.................................. 4 1.3................................... 4 2 5 2.1 GPU...........................................

More information

kiso2-03.key

kiso2-03.key 座席指定はありません Linux を起動して下さい 第3回 計算機基礎実習II 2018 のウェブページか ら 以下の課題に自力で取り組んで下さい 計算機基礎実習II 第2回の復習課題(rev02) 第3回の基本課題(base03) 第2回課題の回答例 ex02-2.c include int main { int l int v, s; /* 一辺の長さ */ /* 体積 v

More information

C 言語の式と文 C 言語の文 ( 関数の呼び出し ) printf("hello, n"); 式 a a+4 a++ a = 7 関数名関数の引数セミコロン 3 < a "hello" printf("hello") 関数の引数は () で囲み, 中に式を書く. 文 ( 式文 ) は

C 言語の式と文 C 言語の文 ( 関数の呼び出し ) printf(hello, n); 式 a a+4 a++ a = 7 関数名関数の引数セミコロン 3 < a hello printf(hello) 関数の引数は () で囲み, 中に式を書く. 文 ( 式文 ) は C 言語復習 C 言語の基礎 来週もこの資料を持参してください C 言語, ソースファイルの作成, コンパイル, 実行 1 C 言語 C 言語プログラミングの手順 とは, 計算機を動かす手順を記述したもの. 計算機に命令を与えて動かすには を作成する ことになる. C 言語はプログラミング言語の 1 個 手続き型言語に分類される. C/C++ は非常に多くの場面で使われる言語 C++ は C 言語をオブジェクト指向に拡張したもの

More information

AICS 村井均 RIKEN AICS HPC Summer School /6/2013 1

AICS 村井均 RIKEN AICS HPC Summer School /6/2013 1 AICS 村井均 RIKEN AICS HPC Summer School 2013 8/6/2013 1 背景 OpenMP とは OpenMP の基本 OpenMP プログラミングにおける注意点 やや高度な話題 2 共有メモリマルチプロセッサシステムの普及 共有メモリマルチプロセッサシステムのための並列化指示文を共通化する必要性 各社で仕様が異なり 移植性がない そして いまやマルチコア プロセッサが主流となり

More information

XcalableMP入門

XcalableMP入門 XcalableMP 1 HPC-Phys@, 2018 8 22 XcalableMP XMP XMP Lattice QCD!2 XMP MPI MPI!3 XMP 1/2 PCXMP MPI Fortran CCoarray C++ MPIMPI XMP OpenMP http://xcalablemp.org!4 XMP 2/2 SPMD (Single Program Multiple Data)

More information

1 return main() { main main C 1 戻り値の型 関数名 引数 関数ブロックをあらわす中括弧 main() 関数の定義 int main(void){ printf("hello World!!\n"); return 0; 戻り値 1: main() 2.2 C main

1 return main() { main main C 1 戻り値の型 関数名 引数 関数ブロックをあらわす中括弧 main() 関数の定義 int main(void){ printf(hello World!!\n); return 0; 戻り値 1: main() 2.2 C main C 2007 5 29 C 1 11 2 2.1 main() 1 FORTRAN C main() main main() main() 1 return 1 1 return main() { main main C 1 戻り値の型 関数名 引数 関数ブロックをあらわす中括弧 main() 関数の定義 int main(void){ printf("hello World!!\n"); return

More information

数はファイル内のどの関数からでも参照できるので便利ではありますが 変数の衝突が起こったり ファイル内のどこで値が書き換えられたかわかりづらくなったりなどの欠点があります 複数の関数で変数を共有する時は出来るだけ引数を使うようにし グローバル変数は プログラムの全体の状態を表すものなど最低限のものに留

数はファイル内のどの関数からでも参照できるので便利ではありますが 変数の衝突が起こったり ファイル内のどこで値が書き換えられたかわかりづらくなったりなどの欠点があります 複数の関数で変数を共有する時は出来るだけ引数を使うようにし グローバル変数は プログラムの全体の状態を表すものなど最低限のものに留 第 10 章分割コンパイル 1 ソースを分割する今まで出てきたソースは全て一つのソースファイルにソースを記述してきました しかし ソースが長くなっていくと全てを一つのファイルに書くと読みづらくなります そこで ソースを複数のファイルに分割してコンパイルを行う分割コンパイルをします 今章は章名にもなっている 分割コンパイルの方法についてやります 分割コンパイルする時は大抵 関連性のある機能ごとにファイルにまとめます

More information

Slide 1

Slide 1 OpenFoam のための C/C++ 第 3 回 OpenFoam で勉強るテンプレート 田中昭雄 1 目的 この勉強会の資料があれば OpenFoam カスタマイズ時に C/C++ で迷わない 2 予定 第 1 回メモリ管理 第 2 回 CFDの例で勉強するクラス 第 3 回 OpenFOAMで勉強するテンプレート 第 4 回 OpenFOAMカスタマイズ 第 5 回未定 第 6 回未定 3 今回のテーマ

More information

02: 変数と標準入出力

02: 変数と標準入出力 C プログラミング入門 基幹 7 ( 水 5) 12: コマンドライン引数 Linux にログインし 以下の講義ページを開いておくこと http://www-it.sci.waseda.ac.jp/ teachers/w483692/cpr1/ 2016-06-29 1 まとめ : ポインタを使った処理 内容呼び出し元の変数を書き換える文字列を渡す 配列を渡すファイルポインタ複数の値を返す大きな領域を確保する

More information

$ cmake --version $ make --version $ gcc --version 環境が無いあるいはバージョンが古い場合は yum などを用いて導入 最新化を行う 4. 圧縮ファイルを解凍する $ tar xzvf gromacs tar.gz 5. cmake を用

$ cmake --version $ make --version $ gcc --version 環境が無いあるいはバージョンが古い場合は yum などを用いて導入 最新化を行う 4. 圧縮ファイルを解凍する $ tar xzvf gromacs tar.gz 5. cmake を用 本マニュアルの目的 Linux サーバー版 Gromacs インストールマニュアル 2015/10/28 本マニュアルでは 単独ユーザが独占的に Linux サーバー (CentOS 6.6) を使用して Gromacs ジョブを実行するための環境構築方法と Winmostar のリモートジョブ機能による計算手順を示しています つまり複数ユーザが共同使用する計算サーバー等は対象外です そのため計算環境は全てユーザのホームディレクトリ配下で行う構築することを想定しています

More information

研究背景 大規模な演算を行うためには 分散メモリ型システムの利用が必須 Message Passing Interface MPI 並列プログラムの大半はMPIを利用 様々な実装 OpenMPI, MPICH, MVAPICH, MPI.NET プログラミングコストが高いため 生産性が悪い 新しい並

研究背景 大規模な演算を行うためには 分散メモリ型システムの利用が必須 Message Passing Interface MPI 並列プログラムの大半はMPIを利用 様々な実装 OpenMPI, MPICH, MVAPICH, MPI.NET プログラミングコストが高いため 生産性が悪い 新しい並 XcalableMPによる NAS Parallel Benchmarksの実装と評価 中尾 昌広 李 珍泌 朴 泰祐 佐藤 三久 筑波大学 計算科学研究センター 筑波大学大学院 システム情報工学研究科 研究背景 大規模な演算を行うためには 分散メモリ型システムの利用が必須 Message Passing Interface MPI 並列プログラムの大半はMPIを利用 様々な実装 OpenMPI,

More information

フローチャートの書き方

フローチャートの書き方 アルゴリズム ( 算法 ) 入門 1 プログラムの作成 機械工学専攻泉聡志 http://masudahp.web.fc2.com/flowchart/index.html 参照 1 何をどのように処理させたいのか どのようなデータを入力し どのような結果を出力させるのか問題を明確にする 2 問題の内容どおりに処理させるための手順を考える ( フローチャートの作成 )~アルゴリズム( 算法 ) の作成

More information