並列プログラミング入門(OpenMP編)

Size: px
Start display at page:

Download "並列プログラミング入門(OpenMP編)"

Transcription

1 登録施設利用促進機関 / 文科省委託事業 HPCI の運営 代表機関一般財団法人高度情報科学技術研究機構 (RIST) 1 並列プログラミング入門 (OpenMP 編 ) 2019 年 1 月 17 日 高度情報科学技術研究機構 (RIST) 山本秀喜

2 RIST 主催の講習会等 2 HPC プログラミングセミナー 一般 初心者向け : チューニング 並列化 (OpenMP MPI) 京 初中級者向け講習会 京 利用者 利用予定者向け : 京 に特化した内容 ワークショップ等 一般 経験者向け : ユーザー間の情報共有 RIST 主催 共催の講習会 セミナー ワークショップ一覧 RIST 講習会 で出てきます 多分

3 Outline 3 はじめに ( 現在の HPC について ) 並列処理 OpenMP 入門 並列実行領域中のデータの属性 アクセス競合に注意すべきループ データ共有属性ミスの例 ループの並列化と依存性 Reduction 演算 DO ループのスケジューリング 並列の制御 同時処理 実行時ライブラリルーチンと環境変数 OpenMP 並列化例

4 はじめに 4 現在の HPC 用コンピュータの形態 複数のコンピュータ群からなる 1 台 1 台をノードと呼ぶ 性能を活かすにはノード間の並列化が必要 参考 : 京 は約 8 万ノード ノード CPU Core Core Core Core メモリ ノード CPU Core Core Core Core メモリ マルチコア CPU( メニーコア ) CPU 内に複数のプロセッサーコア パソコンでも主流 性能を活かすにはノード内の並列化が必要 参考 : 京 は 8 コア CPU が 1 個 / ノード ノード CPU ネットワーク ( インターコネクト ) メモリ ノード CPU メモリ Core Core アクセラレータ ( 省略 ) Graphics Processing Unit(GPU) Core Core Core Core Core Core 本日の題目ノード内並列化に多く用いられる OpenMP の入門的内容 ( ノード間並列化に使われる MPI はこの後 )

5 5 並列処理 並列処理の形態を説明します

6 並列処理とは 6 逐次 4 並列 処理処理処理処理 処理処理処理処理 処理を分割して同時並列に実行すること処理終了までの時間の短縮が目的マルチコア環境では各コアに処理を分配したい 時間

7 プロセスとスレッド 7 スレッド プロセスより小さい実行単位 ( 処理の分割単位 ) プロセス スレッド スレッド プロセス スレッド メモリ空間 逐次実行中 ( 通常 ) のプロセス ( シングルスレッド ) メモリ空間 並列実行中のプロセス (2 スレッド ) 1 プロセス内のスレッドはメモリ空間を共有する 1 つのスレッドは 1 つのコアで実行される

8 プロセスとスレッド (cont.) 8 スレッド プロセスより小さい実行単位 ( 処理の分割単位 ) CPU CPU コアコアコアコア スレッドスレッドスレッド 稼働中 空き 稼働中 稼働中 1 スレッドプロセスを処理中の 2 コア CPU 2 スレッドプロセスを処理中の 2 コア CPU マルチスレッドのプロセスはマルチコアの性能を引き出せる

9 おもな並列化方式 9 スレッド並列 プロセス並列 プロセス プロセス プロセス スレッド スレッド スレッド スレッド メモリ空間 メモリ空間 プロセス間通信 メモリ空間 OpenMP 自動並列 ノード内の並列 ( 共有メモリ並列 ) MPI(Message Passing Interface) ノード間の並列 ( 分散メモリ並列 ノード内の並列も可 )

10 おもな並列化方式 (cont.) 10 ノード ハイブリッド並列 (OpenMP+MPI) ノードプロセスプロセス スレッド スレッド スレッド スレッド メモリ空間 プロセス間通信 メモリ空間 例えば 京 コンピュータでは 通信量の削減の観点から ノード内を OpenMP 並列または自動並列 ノード間を MPI 並列 という両者を組み合わせたハイブリッド並列が推奨されている

11 11 OpenMP 入門 OpenMP の Hello world プログラムと DO ループの並列化を紹介します

12 OpenMP による並列化 12 do i = 1, 4000 A(i) = B(i) + C(i)!$omp parallel do do i = 1, 4000 A(i) = B(i) + C(i)!$omp end parallel do OpenMP 構文による並列化 ループを挟むように構文 ( ディレクティブ ) を挿入

13 代表的な OpenMP 構文 (Fortran) 13 代表的なOpenMP 構文 (Fortran)!$omp parallel /!$omp end parallel!$omp do!$omp parallel do!$omp parallel do reduction(+: )!$omp critical!$omp barrier!$omp single!$omp ordered

14 代表的な OpenMP 構文 (C/C++) 14 代表的な OpenMP 構文 (C/C++) #pragma omp parallel #pragma omp for #pragma omp parallel for #pragma omp parallel for reduction(+: ) #pragma omp critical #pragma omp barrier #pragma omp single #pragma omp ordered #pragma omp parallel for for ( i=0 ; i<4000 ; i++ ) { A[i] = B[i] + C[i]; }

15 並列実行領域 (parallel 構文 ) 15 parallel 構文!$omp parallel [ 指示節 [, 指示節 ]] parallel~end parallel で囲まれた領域を並列実行します program hello write(*,*) Hello world!$omp parallel write(*,*) Hello OpenMP world!$omp end parallel end 並列実行領域 (parallel region)

16 実行例 :Hello OpenMP world 16 $ frt -Kopenmp hello.f (*) $ export OMP_NUM_THREADS=4 (**) $./a.out 実行 Hello world 逐次部分からの出力 Hello OpenMP world Hello OpenMP world Hello OpenMP world Hello OpenMP world $ OpenMP オプションをつけてコンパイル スレッド数 ( 並列数 ) を環境変数で設定 並列実行領域の出力 (4 並列実行 ) コンパイラによってオプションが違う (*) intel fortran: ifort openmp hello.f GNU: gfortran fopenmp hello.f 京 login-node: frtpx Kopenmp hello.f (**) csh の場合 : setenv OMP_NUM_THREADS 4

17 OpenMP スレッドの動作 17 マスタースレッド プログラム開始 逐次実行領域 分岐 (fork): スレッドチーム結成 ( ワーカースレッド生成 )!$omp parallel スレッド 0 = マスタースレッド スレッド 1 スレッド 2 スレッド 3 並列実行領域 合流 (join): スレッドチーム消滅 ( ワーカースレッド消滅 ) マスタースレッド!$omp end parallel 逐次実行領域 プログラム終了

18 パラレル構文の効果 18 逐次 処理 並列? 処理 Parallel 構文 スレッドの分岐 合流を制御 処理の割り振りはしない 処理 処理 処理 処理 並列化には処理の割り振り が必要 時間 処理 処理 後述のワークシェアリング構文を利用する

19 ワークシェアリング構文 19 Parallel 構文は スレッドチームの分岐 / 合流を制御する 並列化には さらに 処理の割り振り ( ワークシェアリング ) が必要 OpenMP ではワークシェアリング構文を用いる ワークシェアリング構文の種類 ループ構文 do ループを分割実行 single 構文 生成されたスレッドのうち 1 つのスレッドのみが実行 sections 構文 依存関係のない異なる処理をそれぞれのスレッドで実行 workshare 構文 (Fortran のみ ) fortran90 以降の配列代入文などを分割実行 本資料では ループ構文を主に扱います

20 DO ループのワークシェアリング 20 do 構文 ( ループ構文 ) 並列実行領域において do ループを分割し チーム内の各スレッドに割り当てます デフォルトでは 均等に分割され 各スレッドにより実行されます!$omp parallel!$omp do do i = 1, 4000 V(i) = X(i) + Y(i)!$omp!$omp end parallel 逐次 ループ長 n=4000 n= 並列で実行 4 並列 スレッド 0 が実行スレッド 1 が実行スレッド 2 が実行スレッド 3 が実行

21 DO ループのワークシェアリングの 21 書式 (Fortran) do i = 1, 4000 V(i) = X(i) + Y(i)!$omp parallel!$omp do do i = 1, 4000 V(i) = X(i) + Y(i)!$omp!$omp end parallel この DO ループを並列化する パラレル構文!$omp parallel [ 指示節 [, 指示節 ]] 並列実行領域!$omp end parallel ( 省略不可 ) parallel~end parallel で囲まれた領域を並列実行 ループ構文 (DO 構文 )!$omp do [ 指示節 [, 指示節 ]] do ループ [!$omp ] ( 省略可能 )!$omp parallel do do i = 1, 4000 V(i) = X(i) + Y(i)!$omp end parallel do パラレルループ構文 ( パラレル構文とループ構文の複合 )!$omp parallel do [ 指示節 [, 指示節 ]] doループ [!$omp end parallel do] ( 省略可能 ) 後続のdoループを各スレッドで分割して並列実行します

22 22 DO ループのワークシェアリングの 書式 (Fortran) の省略形 do i = 1, 4000 V(i) = X(i) + Y(i) この DO ループを並列化する!$omp parallel!$omp do do i = 1, 4000 V(i) = X(i) + Y(i)!$omp!$omp end parallel!$omp は省略可能です!$omp parallel!$omp do do i = 1, 4000 V(i) = X(i) + Y(i)!$omp end parallel!$omp parallel do do i = 1, 4000 V(i) = X(i) + Y(i)!$omp end parallel do!$omp end parallel do を省略すると!$omp parallel do do i = 1, 4000 V(i) = X(i) + Y(i)

23 For ループのワークシェアリングの 23 書式 (C 言語 ) for ( i=0 ; i<4000 ; i++ ) { V[i] = X[i] + Y[i]; } この for ループを並列化する #pragma omp parallel { #pragma omp for for ( i=0 ; i<4000 ; i++ ) { V[i] = X[i] + Y[i]; } } パラレル構文 (C 言語 ) #pragma omp parallel [ 指示節 [, 指示節 ]] 後続の領域を並列実行します ループ構文 (for 構文 )(C 言語 ) #pragma omp for [ 指示節 [, 指示節 ]] 後続のforループを分割して各スレッドに割り当てます #pragma omp parallel for for ( i=0 ; i<4000 ; i++ ) { V[i] = X[i] + Y[i]; } パラレルループ構文 (C 言語 ) #pragma omp parallel for [ 指示節 [, 指示節 ]] 後続の for ループを各スレッドで分割して並列実行します

24 24 並列実行領域中のデータの属性 スレッド間でのデータの共有属性 (shared 属性とprivate 属性 )

25 並列実行領域中のデータの属性 25 データ共有属性 ( 並列領域内の変数 配列の属性 ) Sharedデータ : 全てのスレッドからアクセス可能なデータ Privateデータ : 各スレッド固有の 他のスレッドからは見えないデータ!$omp parallel do do i = 1, 4000 V(i) = X(i) + Y(i) スレッド スレッド private データ i shared データ V(:), X(:), Y(:) private データ i OpenMP では データ共有属性をプログラマの責任で設定する必要があります 誤った設定は 不正な結果 ( バグ ) の原因となります

26 データ共有属性の宣言 26 データ共有属性の宣言 parallel 構文や do 構文の指示節として指定します!$omp parallel do private(i) shared(v, X, Y) do i = 1, 4000 V(i) = X(i) + Y(i) 暗黙のデータ共有属性 並列実行領域において 指定の無いほとんどのデータは デフォルトで shared 属性 ( 詳細は後述 ) parallel do または do 構文のループ内のループインデックス変数は その構文内で private 属性 暗黙のデータ共有属性により 上記の例では private(i) shared(v, X, Y) を省略可

27 Shared 属性 27 Shared データ すべてのスレッドから参照可能 並列実行領域開始前と同一の ( メモリ領域に記憶される ) 変数 プログラム開始 マスタースレッド 0 V X Y shared(v, X, Y) shared 指示節で指定されたデータ あるいは暗黙の shared 属性データ マスタースレッド0 スレッド1 スレッド2 スレッド3 並列実行領域

28 Private 属性 28 Private データ 各スレッドに固有のデータ 他のスレッドからはアクセス不可 並列実行領域前の対応する変数とは別の実体 ( メモリー領域 ) を持つ 初期値は未定義 プログラム開始 マスタースレッド 0 i V X Y shared(v, X, Y) マスタースレッド0 スレッド1 スレッド2 スレッド3 i 0 i 1 i 2 i 3 互いにアクセスすることはできない 例えば i 0 はスレッド 0 に固有の i を表す private( i ) Private 指示節で指定されたデータ

29 暗黙のデータ共有属性 (Fortran) 29!$omp parallel!$omp do do i=1,4 X(i)=i call sub(x(i))!$omp!$omp end parallel 並列実行領域内 Private: ループ構文内のループインデックス ( i ) 他にParallel 構文内の逐次 DOループインデックス DO 型反復のインデックスもprivate Shared: 何の指定もない変数 ( X(:) ) default 指示節により変更可 ( 暗黙のデータ共有属性 ) default(shared), default(private), default(none) none の場合は明示的に指定しなければならない subroutine sub(y) common /com/ n save ymax real :: a = 1.0 real :: b end コールされたルーチン内 仮引数はcall 元のルーチンに従う yのアドレスはcall 元のX(i) を指しているので その設定に従う Shared: COMMON/SAVE 文の変数 (n, ymax, a) 他にmoduleやsave 属性の変数もshared Private: 上記以外の変数 (b) a = 1.0 のように初期値を与えると save 属性 詳しくは仕様書を参照してください

30 30 暗黙のデータ共有属性 (Fortran) 並列実行領域内!$omp parallel!$omp do do i=1,4 X(i)=i call sub(x(i))!$omp!$omp end parallel ループ構文内のループインデックス ( i ) は PRIVATE 他に parallel 構文内の逐次の do ループインデックスや do 型反復のインデックスも PRIVATE 上記以外の何の指定もない変数 ( X(:) ) は SHARED この 暗黙のデータ共有属性 は default 指示節 により変更可能 default(shared), default(private), default(none) none の場合は 明示的に指定しないとエラーになる

31 31 暗黙のデータ共有属性 (Fortran) コールされたルーチン内 subroutine sub(y) common /com/ n save ymax real :: a = 1.0 real :: b end 仮引数は call 元のルーチンに従う y のアドレスは call 元の X(i) を指しているので その設定に従う common/save 属性の変数 (n, ymax, a) は SHARED 他に module 変数も SHARED 初期値指定のある変数も save 属性なので要注意 上記以外 (b) は PRIVATE 厳密な規則は仕様書を参照してください この例は スレッドセーフではありません

32 32 アクセス競合に注意すべきループ データ共有属性ミスの例 データ共有属性の設定ミス アクセス競合

33 一時変数を含むループ 33 private 属性の指定忘れに注意!$omp parallel do do i = 1, 4 t = X(i) + Y(i) V(i) = V(i) + t * t スレッド 0 t = X(1) + Y(1) V(1) = V(1) + t * t t = X(2) + Y(2) V(2) = V(2) + t * t 同時更新 t スレッド 1 t = X(3) + Y(3) V(3) = V(3) + t * t t = X(4) + Y(4) V(4) = V(4) + t * t t を private 属性指定しないと t は shared 属性なので t はそれぞれのスレッドから同時更新され タイミングによって結果が異なってしまいます!$omp parallel do private( t )

34 一時変数を含むループ (cont.) 34 private 属性指定の見落とし - 右の例ではループインデックス i 以外 すべてshared 属性となってしまう マスタースレッド 0 t = t * t プログラマが期待? した動作 スレッド0が更新スレッド0が結果を読込スレッド1が更新スレッド1が結果を読込!$omp parallel do do i = 1, 4000 t = X(i) + Y(i) V(i) = V(i) + t * t shared(t, V, X, Y) t t V X Y 各スレッドの更新 読込に 運良く重なりが無ければ正しい結果となる

35 一時変数を含むループ (cont.) 35 private 属性指定の見落とし - 右の例ではループインデックス i 以外 すべてshared 属性となってしまう マスタースレッド 0!$omp parallel do do i = 1, 4000 t = X(i) + Y(i) V(i) = V(i) + t * t t = スレッド 0 が更新 意図しないタイミングでの t の更新が発生する可能性があり 時々不正な結果となる 別スレッドの意図せぬ更新 shared(t, V, X, Y) t t V X Y t * t スレッド 0 が不正な結果を読込 異常終了せず 常に不正な値を与えるわけではないので 表面化しにくい

36 一時変数を含むループ ( 不正の回避 ) 36 private 属性を正しく指定する - 左辺にあって複数のスレッドが更新する変数は private にする!$omp parallel do private( t ) do i = 1, 4000 t = X(i) + Y(i) V(i) = V(i) + t * t プログラム開始 マスタースレッド 0 V X Y shared(v, X, Y) マスタースレッド 0 スレッド 1 スレッド 2 スレッド 3 t 0 t 1 t 2 t 3 private( t ) プログラムは正常に動作します

37 サブルーチンコールのあるループ 37!$omp parallel do do i = 1, 4 call SUB( ) Subroutine SUB( ) call SUB2( ) end Subroutine SUB2( ) COMMON /COM/ WORK(100) WORK(1) = = WORK(1) end サブルーチン内でも common の変数は shared スレッド 0 スレッド 1 WORK(1) = = WORK(1) 同時更新の恐れあり WORK(1) サブルーチン内部の common や save 属性の変数に注意してください WORK(1) = = WORK(1) 上記の例では 他のサブルーチンで /COM/ を利用している場合は threadprivate 構文で private 化します ( 詳細はおまけの 共有変数がある場合の注意 を参照 )

38 スレッドセーフとは ( 競合と排他制御 ) 38 スレッドセーフなルーチン 複数のスレッドで同時に実行しても意図した機能を果たすルーチン 例えば 間接参照を含むルーチンで同一のアドレスをアクセスしてしまうような処理は 競合が発生しており スレッドセーフではなくなります スレッドセーフでない処理の例 : COMMON や SAVE 属性の変数にアクセスしている関数 サブルーチンで 排他制御が正しくできていないルーチン ローカル変数であっても コンパイル時に -save オプションを付加した場合 同一のユニット番号に対する READ や WRITE などの I/O 処理 (Fortran の規格ではスレッドセーフを保証していません ) 本資料では理解しやすさのため 並列実行領域内で write 文を実行するプログラム例が多数ありますが 本来は critical 構文等で排他制御をすべきです スレッドセーフでない処理を並列実行してしまうと 計算結果が不正だったり プログラムが異常終了する場合があります 常に発生するとは限らない上 実行環境により頻度が変わるため 問題が発見しにくい場合があります

39 39 OpenMP 化によるミスの特徴 PRIVATE/SHARED 属性宣言のミス ( アクセス競合 ) 不正な結果 ( バグ ) の原因 実行の度に結果が異なる場合がある 発生頻度は 2 回に 1 度のこともあれば 数千回に 1 回のことも 発見しにくい OpenMP ではデータ共有属性を注意して設定する必要がある コンパイラによっては警告を出してくれることもある

40 40 ループの並列化と依存性 並列化してはダメなループ

41 41 並列化できないループ 並列化してはダメなループ ループ構文で並列化できないループ : exit 等 途中でループを抜ける命令があるループ goto~continue のループ構造 等 コンパイルできない!$omp parallel do do i = 1, N if ( ) exit A(i) = A(i) 並列化してはいけないループ ( 次スライドで説明 ): 他のサイクルの結果を参照するループ = 反復 ( サイクル ) 間に依存性のあるループ OpenMP で 並列 実行できてしまうが 逐次実行と異なる結果を与えてしまう!$omp parallel do do i= 2, N V(i) = V(i - 1) + a

42 42 並列化してはいけない例 (1) フロー依存のあるループ ( 逐次 ) do i = 2, 7 V(i) = V(i - 1) + a 上のサイクルの結果を利用して計算している 例えば i=5の計算 : V(5) は サイクル i=4 の結果の V(4) を用いて計算する 逐次実行 i=2: V(2) = V(1) + a i=3: V(3) = V(2) + a i=4: V(4) = V(3) + a i=5: V(5) = V(4) + a i=6: V(6) = V(5) + a i=7: V(7) = V(6) + a 分割 フロー依存とは Write After Read

43 43 並列化してはいけない例 (1) フロー依存のあるループ!$omp parallel do do i = 2, 7 V(i) = V(i-1) + a!$omp parallel do private(t) do i = 2, 7 t = V( i 1 ) V( i ) = t + a 一時変数を使っても同じ スレッド 0 スレッド 1 V(2) = V(1) + a V(3) = V(2) + a V(4) = V(3) + a 最後に V(4) の計算が完了 計算結果が実行順序に依存 V(5) = V(4) + a 最初に更新後の V(4) の値が必要 V(6) = V(5) + a V(7) = V(6) + a ( 注 ) スレッド 0 が V(4) を計算する前に スレッド 1 が V(4) を参照してしまいます

44 44 並列化してはいけない例 (2) 逆依存のあるループ ( 逐次 ) do i = 1, 6 V(i) = V(i+1) + a 上のサイクルで使用した要素を上書きしながら計算している 例えば i=3の計算 : V(3) は 更新前の V(4) を用いて計算し 次の i=4 で V(4) は上書きされます 逐次実行 i=1: V(1) = V(2) + a i=2: V(2) = V(3) + a i=3: V(3) = V(4) + a i=4: V(4) = V(5) + a i=5: V(5) = V(6) + a i=6: V(6) = V(7) + a 分割 逆依存とは Read After Write

45 45 並列化してはいけない例 (2) 逆依存のあるループ!$omp parallel do do i = 1, 6 V(i) = V(i+1) + a!$omp parallel do private(t) do i = 1, 6 t = V( i +1 ) V( i ) = t + a 一時変数を使っても同じ スレッド0 スレッド 1 V(1) = V(2) + a V(2) = V(3) + a V(3) = V(4) + a 最後に更新前の V(4) が必要 計算結果が実行順序に依存 V(4) = V(5) + a 最初に V(4) の値を上書き V(5) = V(6) + a V(6) = V(7) + a ( 注 ) スレッド 0 が V(4) の元の値を参照とする前に スレッド 1 が先に V(4) の値を更新してしまいます

46 46 並列化してはいけない例 (3) 重なりのある間接参照のあるループ 間接参照のあるループ?!$omp parallel do do i = 1, 4 V( List( i ) ) = X(i) + Y(i) スレッド 0 V( List(1) ) = X(1) + Y(1) V( List(2) ) = X(2) + Y(2) 同じ要素を更新する可能性 V スレッド 1 V( List(3) ) = X(3) + Y(3) V( List(4) ) = X(4) + Y(4) 例えば List(2) = List(4) の場合 どちらの間接参照が後にアクセスされるかによって結果が変化します ( 順番に依存 ) 配列 List( ) の値がすべて異なる ( ユニークな ) 場合を除き並列化してはいけません

47 47 Reduction 演算 総和などの計算をおこなう reduction 指示節を 説明します

48 総和計算の並列化 48 総和の計算を並列化する!$omp parallel do do i = 1, 4 S = S + V(i) スレッド 0 スレッド 1 S = S + V(1) S = S + V(2) 同時更新の可能性 S が shared 属性ならば スレッド 0 とスレッド 1 がそれぞれ勝手なタイミングで S の値を更新するため 結果は不定となります もし S を private 属性にすると 全体の総和を得ることはできません S 解決するには? S = S + V(3) S = S + V(4)

49 総和計算の並列化 (cont.) 49 総和の計算を並列化する reduction 指示節!$omp parallel do reduction (+: S) do i = 1, 4 S = S + V(i) S は特殊な private 変数として扱われる (reduction 変数 ) スレッド 0 スレッド 1 S 0 = 0 S 0 = S 0 + V(1) S 0 = S 0 + V(2) 初期値 S 1 = 0 S 1 = S 1 + V(3) S 1 = S 1 + V(4) S = S + S0 + S1 元の変数に加算 ( 注 )Reduction 演算は 計算の順序が逐次演算と異なります そのため 丸め誤差により結果が微妙に異なる可能性があります 数値計算的には V(1) + V(2) + V(3) +V(4) { V(1) + V(2) } + { V(3) +V(4) } 加算順序はスレッド番号順とは限りません

50 Reduction 指示節 50 総和 ( 足し算 ) 以外の演算にも reduction 指示節が使えます!$omp parallel do reduction(op : r 1 [, r 2 ] ) op : reduction 演算子 (+, *, -,.and.,.or.,.eqv.,.neqv., max, min, iand, ior, ieor) r 1 [, r 2 ] : reduction 変数 ( 複数指定可 ) Reduction 演算 複数の変数を何らかの演算で一個の変数に縮約する操作 一般例 : r = r op expr の繰り返し等 (r: reduction 変数, expr: rを参照しない式 ) Reduction 指示節により ループ内で reduction 変数の private なコピーを作成し ループ終了後 各スレッドの演算結果を元の変数に縮約する

51 Reduction 指示節 (cont.) 51 表 Reduction 変数の演算と初期値 演算初期値演算初期値 + 0.neqv..false. * 1 max - 0 min 変数の型で表せる最小の値 変数の型で表せる最大の値.and..true. iand すべてのビットが 1.or..false. ior 0.eqv..true. ieor 0 Reduction 変数は ループ内では privateな一時変数として扱われます ループ開始時に演算子の種類に応じて適切に初期化されます

52 52 DO ループのスケジューリング オーバーヘッドとロードバランス そして OpenMPで用意されているスケジューリングの方法について説明します

53 オーバーヘッド 53 並列化によって プログラムの実行時間を短縮することができますが 逐次 4 並列 時間並列化 オーバーヘッド 1/4 オーバーヘッド 1 並列化にはオーバーヘッドがつきものです スレッド生成 同期 並列化に伴うコード変更による処理の増加等 完全な並列化をおこなってもオーバーヘッドのため 1/4 にはならない オーバーヘッドが無視できる程度の大きい処理を並列化すべき ( 多重ループならば外側が望ましい )

54 オーバーヘッド (cont.) 54!$omp parallel do do i = 1, 10!$omp end parallel do!$omp parallel do do i = 1, !$omp end parallel do 反復数の少ないループより多いループの方がオーバーヘッドが相対的に小さくなります do j = 1, n!$omp parallel do do i = 1, n!$omp end parallel do!$omp parallel do do j = 1, n do i = 1, n!$omp end parallel do 内側ループより外側ループを並列化した方が!$omp parallel do の呼び出し回数が少なくオーバーヘッドが少なくなります

55 ロードバランス 55 均等な処理の割り振り (load balancing) にも注意する必要があります 時間 逐次 並列化 4 並列 1/4 idle idle idle 1 不均等 ( インバランス ) な割振りでは 期待した性能が出ないことがあります

56 ループ構文とスケジューリング 56 Schedule 指示節により ループ反復の割当方法を変更できます!$omp parallel do schedule( スケジューリングの種別 ) スケジューリング指示節割当方法 schedule(static) 均等に分割 <デフォルト> schedule(static, chunk) schedule(dynamic [,chunk ] ) schedule(guided [,chunk ] ) schedule(auto) schedule(runtime) chunk で指定した反復数のチャンクに分割し スレッド番号順に巡回的に割り当てます chunk で指定した反復数のチャンクに分割し スレッドからの要求に応じて動的に割り当てます 各スレッドは 1 チャンクを実行し 次のチャンクを要求します <chunk 省略時は chunk=1> dynamic と同様ですが チャンクの大きさが残りの反復数に応じて徐々に小さくなります チャンク分割サイズは chunk で指定した値が最小になります <chunk 省略時は chunk=1> スケジューリングは コンパイラ および / または 実行時システムに委ねられます スケジューリングは 実行時の環境変数 OMP_SCHEDULE によって決定されます 例 : export OMP_SCHEDULE= guided, 1

57 STATIC( 静的 ) スケジューリング 57!$omp parallel do schedule( スケジューリングの種別 ) Schedule 指示節により ループ反復の割当方法を変更できます 逐次 全てをマスタースレッドが処理 静的割り当て : 実行前に割り当てを決める schedule(static) デフォルト schedule(static, 1) schedule(static, 2) 均等に分割 <デフォルト> サイズ1のチャンクに分割し 順繰りに配分サイズ2のチャンクに分割し 順繰りに配分 ( はループの 1 反復 (1 サイクル ) を示す )

58 DYNAMIC( 動的 ) スケジューリング 58!$omp parallel do schedule( スケジューリングの種別 ) Schedule 指示節により ループ反復の割当方法を変更できます 動的割り当て : 処理の終わったスレッドが次のチャンクに取りかかる サイクルごとの処理量が不均一な時に効果的だが static スケジューリングよりオーバーヘッドが大きい schedule(dynamic, 2) thread0 thread1 thread2 thread3 thread2 thread3 thread1 thread0 thread2 thread3 thread1 サイズ 2 のチャンクに分割し 動的に割り当て ( デフォルトのチャンクサイズは 1) thread0

59 スケジューリングとロードバランス 59 三角行列とロードインバランス do j = 1, n do i = j, n A(i, j) = A(i, j) + B(i, j) j!$omp parallel do do j = 1, n do i = j, n A(i, j) = A(i, j) + B(i, j) 単純に 4 並列実行 i スレッド が担当 処理量に差 ロードインバランス状態

60 スケジューリングとロードバランス (cont.) 60 ロードバランスの改善!$omp parallel do schedule(static, 1) do j = 1, n do i = j, n A(i, j) = A(i, j) + B(i, j)!$omp parallel do schedule(dynamic) do j = 1, n do i = j, n A(i, j) = A(i, j) + B(i, j) スレッド が担当 スレッド が担当 チャンクを細かくするとデフォルトの static よりロードバランスが改善し 負荷が均等になります Dynamic は完璧なように思えますが オーバーヘッドが大きいので注意が必要です

61 61 並列の制御 同期処理 並列処理領域内の逐次処理同期処理排他制御 排他制御 同期処理

62 暗黙の同期 62 ループ構文などのワークシェアリング構文の出口では 暗黙に同期処理が行われます!$omp parallel!$omp do do i = 1, n V(i) = V(i) + X(i)!$omp 暗黙の同期!$omp do do i = 1, n W(i) = W(i) + Y(i)!$omp 暗黙の同期!$omp end parallel マスタースレッド 待ち合わせ 待ち合わせ 各 DO ループの終了時に 全スレッドの処理終了を待ってから 次の DO ループの処理に移ります 待ち合わせのための若干のオーバーヘッドがかかります

63 暗黙の同期の回避 (nowait 指示節 ) 63 暗黙の同期処理が不要ならば nowait 指示節により 同期を回避できます!$omp parallel!$omp do do i = 1, n V(i) = V(i) + X(i)!$omp nowait!$omp do do i = 1, n W(i) = W(i) + Y(i)!$omp 暗黙の同期!$omp end parallel 同期を回避 マスタースレッド 待ち合わせ nowait 指示節を指定すると do ループ終了時の待ち合わせをせず 直ちに次の処理に移ります これにより待ち合わせのオーバーヘッドを減らすことができますが 誤った箇所に nowait を指定すると不正な結果が得られることがあります

64 ループ内の暗黙の同期 64 二重ループの内側を並列化する場合の 暗黙の同期 マスタースレッド !$omp parallel do j = 2, m!$omp do do i = 1, n W(i, j) = W(i, j-1) + Y(i, j)!$omp!$omp end parallel j = 2 j = 3 j = 4 待ち合わせ 待ち合わせ j ループが反復するごとに同期が発生します

65 ループ内の暗黙の同期の回避 65 二重ループの内側を並列化する場合の 暗黙の同期の回避!$omp parallel do j = 2, m!$omp do do i = 1, n W(i, j) = X(i, j-1) + Y(i, j)!$omp nowait!$omp end parallel 待ち合わせせず 次の j へ進む マスタースレッド 0 j = 2 j = 3 j = j ループの前の反復の計算を全スレッドが完了するのを待つ必要が無い場合のみ nowait を使用できます ループの繰り返し依存がないか注意が必要です j ループの反復数分の同期オーバーヘッドの節約になります

66 並列実行領域中の逐次処理 66 並列実行領域の中に並列化できない逐次処理を含めたい場合 並列実行領域を終わらせることなく 1 つのスレッドによる逐次処理を行う領域を設けることができます 構文 内容 single 指定された領域の処理を 一つのスレッドが実行します ( マ スタースレッドであるとは限りません ) 指定領域の出口で 暗黙の同期を行います master 指定された領域の処理を マスタースレッドが実行します 指定領域の出口で 暗黙の同期は行いません!$omp parallel!$omp single write(6, * ) Serial processing!$omp end single!$omp end parallel シングル処理一回だけ実行 並列実行領域

67 バリア同期 (barrier 構文 ) 67 barrier 構文 - スレッドの待ち合わせ ( 同期 ) を行います!$omp parallel!$omp master allocate( V(n) )!$omp end master!$omp barrier!$omp do do i = 1, n V(i) = Y(i)!$omp!$omp end parallel 配列 V の準備 待ち合わせ 暗黙の同期 マスタースレッド 待ち合わせ 待ち合わせ master 指示節は 暗黙の同期 ( 待ち合わせ ) を行いませんので スレッド 1 3 の後の処理 ( 緑 ) を待たせるためには barrier 指示節が必要です

68 critical 構文 ( 排他制御 ) 68 critical 構文は 指定範囲について複数スレッドの処理が重ならないようにし ( 排他制御 ) アクセス競合を回避する real :: sum, xcount, function real :: x(n, m) do j = 1, m!$omp parallel shared ( x, xcount )!$omp single xcount = 0.0!$omp end single!$omp do do i = 1, n!$omp critical if ( x( i, j ).lt. 1.0 ) then xcount = function ( xcount, x( i, j ) ) end if!$omp end critical スレッド !$omp do reduction ( +: sum ) do i = 1, 4000 sum = sum + x( i, j ) + xcount!$omp end parallel end 一人ずつアクセスする

69 その他の同期 排他処理構文 69 構文 atomic flush ordered 内容 critical 指示節と同様に排他処理をしますが こちらの方が高速です ただし インクリメントなどの特定の演算の文にのみ使用できます フラッシュ操作を行います あるスレッドが持つ一時的なビュー ( レジスタやキャッシュ等の内容 ) をメモリの内容と一致させます 指定したループ領域において 逐次実行した場合と同じ順序で実行するよう順序付けを行います

70 70 実行時ライブラリルーチンと 環境変数

71 実行時ライブラリルーチン 71 OpenMP では種々のルーチンが用意されている OpenMP API 実行時ライブラリルーチン 並列実行環境の制御や問合せを行う実行環境ルーチン データへのアクセスを同期して行うためのロックルーチン 時間計測ルーチン 利用するにはヘッダファイルを読み込む include omp_lib.h 一般的な Fortran use omp_lib Fortran90モジュールファイル上記の少なくとも一方が存在することになっている

72 代表的なライブラリルーチン 72 ルーチン名返値内容 omp_get_thread_num integer このルーチンを呼び出したチームに属する スレッド番号を返します 0 [ スレッド数 -1] の値を返します マスタースレッドは0 omp_get_max_threads integer 並列実行領域で利用できるスレッド数の最大値を返 します ( 並列実行領域に入る前でも利用できます ) omp_get_num_threads integer 現在の並列実行領域を実行中のスレッド数を返しま す omp_in_parallel logical 活動状態の並列実行領域内から呼び出された場合.true. それ以外は.false. を返します 並列区間 非並列区間の両方から呼ばれるサブルーチンの分岐に利用できます omp_get_wtime real*8 wall clock の経過時間を秒単位で返します

73 条件付きコンパイル 73!$ で始まる行は OpenMP でコンパイルする時のみ有効となります OpenMP を使わない場合のエラーを防ぐことができます 以下のプログラムの omp_get_max_threads 等は OpenMP のライブラリ関数なので OpenMP 並列を指定しない場合 リンク時にエラーになります integer :: thrdnum, me thrdnum = omp_get_max_threads() me = omp_get_thread_num() 以下のように!$ を用いて書き換えると 通常の (OpenMP を使用しない ) コンパイルの場合 コメント行と見なされ 互換性を保つことができます integer :: thrdnum, me thrdnum = 1 me = 0!$ thrdnum = omp_get_max_threads()!$ me = omp_get_thread_num() ( プリプロセッサーの構文 #ifdef _OPENMP を用いる方法もあります )

74 環境変数 74 OpenMP プログラムの実行に影響する主な環境変数 環境変数 OMP_NUM_THREADS OMP_SCHEDULE 内容 並列実行領域で使用するスレッドの数を設定します スケジュールタイプが runtime であるループ指示文のスケジューリングを制御します ( デフォルトは static) OMP_STACKSIZE 各スレッドが実行時に利用するスタックサイズを指定します スレッドごとの固有データなどのメモリ領域に利用されます ( 注 )OMP_STACKSIZE 大きな private 属性の配列を用いるプログラムでは スレッドの private 用のスタックサイズが不足する場合があります そのような場合は この環境変数を十分大きい値で設定します

75 75 補足 OpenMP 並列化例 OpenMPに限らず並列化の一般知識の補足 OpenMPに関する情報源

76 76 OpenMP 並列化例 OpenMP による並列化の簡単な例 ここでは OpenMP 並列化の説明を行います 逐次での高速化は チューニング技法 の資料を参考にしてください

77 77 OpenMP 並列化例 : 個別要素法 / 分子動力学法の例 各粒子にかかる力の計算 入力データ 粒子数 n 粒子の座標 x(n) 簡単のため 1 次元とする 粒子 i,j 間の相互作用 fij 簡単のため 距離に反比例 fij = 1/(x(j) - x(i)) 各粒子にかかる力の計算 粒子 1 にかかる力 f(1) の場合 f(1)= f12 +f13 +f14 +f15 +f f12 f13 1 f14 4 f16 f15 n = これを f(1) f(6) の全ての粒子について計算図粒子 1 にかかる力 ( 赤矢印 )

78 78 粒子 i にかかる力の合計を f(i) に保存 f(1) = f 12 +f 13 +f 14 +f 15 +f 16 f(2) = -f 12 +f 23 +f 24 +f 25 +f 26 f(3) = -f 13 -f 23 +f 34 +f 35 +f 36 f(4) = -f 14 -f 24 -f 34 +f 45 +f 46 f(5) = -f 15 -f 25 -f 35 -f 45 +f 56 f(6) = -f 16 -f 26 -f 36 -f 46 -f 56 OpenMP 並列化例 : 個別要素法 / 分子動力学法の例 作用反作用の法則 (fji = fij) より 対称な要素は逆符号で同じ値 3 2 f21= -f12 -f13 f12 f13 1 f14 図作用反作用の法則 (fji = fij) 4 f16 f15 -f14 -f16 n = 6 -f15 6 5

79 79 OpenMP 並列化例 : 逐次プログラム n: 粒子数 x(n): 粒子の x 座標の配列 f(n): 粒子にかかる力の配列 dimension x(n), f(n) do i=1,n-1 do j=i+1,n fij = 1.d0/(x(j)-x(i)) f(i) = f(i) + fij f(j) = f(j) - fij 粒子 i,j のループ (i<j) fij: 粒子 i への j による力の計算 一つ fij を計算したら 作用 反作用がかかる配列 f の 2 粒子の要素に加算 f(1)= f 12 +f 13 +f 14 +f 15 +f 16 f(2)= -f 12 i=1の演算実行後の f(3)= -f 13 配列 f の状態 f(4)= -f 14 f(5)= -f 15 n = 6 f(6)= -f 16 i=1 最終結果 f(1)= f 12 +f 13 +f 14 +f 15 +f 16 f(2)= -f 12 +f 23 +f 24 +f 25 +f 26 f(3)= -f 13 -f 23 +f 34 +f 35 +f 36 f(4)= -f 14 -f 24 -f 34 +f 45 +f 46 f(5)= -f 15 -f 25 -f 35 -f 45 +f 56 f(6)= -f 16 -f 26 -f 36 -f 46 -f 56 i=1 i=2 i=3 i=4 i=5 図粒子数 n = 6 の場合の計算内容

80 80 OpenMP 並列化例 : OpenMP 並列化時の検討項目 並列化時の検討項目 (1) 並列化するループの選択 (2) 並列化可能性 ( 計算の順番の依存性 ) の検討 (3) 変数のデータ共有属性の設定 (4) スケジューリングの選択 do i=1,n-1 do j=i+1,n fij = 1.d0/(x(j)-x(i)) f(i) = f(i) + fij f(j) = f(j) - fij

81 81 OpenMP 並列化例 : (1) 並列化するループの選択 オーバーヘッドの観点から 外側のループの並列化が望ましい!$OMP PARALLEL DO... do i=1,n-1 do j=i+1,n fij = 1.d0/(x(j)-x(i)) f(i) = f(i) + fij f(j) = f(j) - fij 結論 : 外側の i に関するループを並列化したい

82 82 OpenMP 並列化例 : (2) 並列化可能性の検討 並列化可能性 ( 計算の順番の依存性 ) の検討 i の加算 減算の順番を変えても配列 f は不変 依存性無し ( 丸め誤差は存在する ) f(1)= f 12 +f 13 +f 14 +f 15 +f 16 f(2)= -f 12 +f 23 +f 24 +f 25 +f 26 f(3)= -f 13 -f 23 +f 34 +f 35 +f 36 f(4)= -f 14 -f 24 -f 34 +f 45 +f 46 f(5)= -f 15 -f 25 -f 35 -f 45 +f 56 f(6)= -f 16 -f 26 -f 36 -f 46 -f 56 i=1 i=2 i=3 i=4 i=5 どの i を先に計算しても最終的な配列 f(i) の値は同じ 結論 : 並列化可能

83 83 OpenMP 並列化例 : (3) 変数のデータ共有属性の設定 スレッド間のアクセス競合が発生する変数を洗い出す 配列 f に関する演算の 2 スレッド実行の例 スレッド0の計算 (i=1 3) スレッド1の計算 (i=4 5) f(1)= f 12 +f 13 +f 14 +f 15 +f 16 f(2)= -f 12 +f 23 +f 24 +f 25 +f 26 f(3)= -f 13 -f 23 +f 34 +f 35 +f 36 f(4)= -f 14 -f 24 -f 34 f(4)= +f 45 +f 46 f(5)= -f 15 -f 25 -f 35 f(5)= -f 45 +f 56 f(6)= -f 16 -f 26 -f 36 f(6)= -f 46 -f 56 i=1 i=2 i=3 i=4 i=5 上の例では スレッド間で要素 f(4) f(6) の同時更新 ( 競合 ) のおそれがあるので スレッドはそれぞれ独自の f を持つ必要がある また 最後に各スレッドの f を要素ごとに合計する必要があるので 配列 f を reduction で指定する必要がある

84 84 OpenMP 並列化例 : (3) 変数のデータ共有属性の設定 cont. スレッド間のアクセス競合が発生する変数を洗い出す 特に並列ループ内の左辺にある変数に注意する ループ変数 j は自動的に private!$omp PARALLEL DO... REDUCTION(+:f) PRIVATE(fij) do i=1,n-1 do j=i+1,n fij = 1.d0/(x(j)-x(i)) f(i) = f(i) + fij f(j) = f(j) - fij fij の値はスレッドごとに異なる 要 private 化 結論 : 配列 f の reduction 変数化変数 fij の private 化が必要

85 85 OpenMP 並列化例 : (4) スケジューリングの選択 デフォルトのスケジューリング!$OMP PARALLEL DO REDUCTION(+:f)!$OMP& PRIVATE(fij) do i=1,n-1... チャンクサイズを小さく (1 に ) した例!$OMP PARALLEL DO REDUCTION(+:f)!$OMP& PRIVATE(fij) SCHEDULE(STATIC,1) do i=1,n 粒子 2 スレッドでのロードバランス 6 粒子 2 スレッドでのロードバランス f 12 +f 13 +f 14 +f 15 +f 16 f 12 +f 13 +f 14 +f 15 +f 16 -f 12 +f 23 +f 24 +f 25 +f 26 -f 13 -f 23 +f 34 +f 35 +f 36 -f 14 -f 24 -f 34 +f 45 +f 46 -f 15 -f 25 -f 35 -f 45 +f 56 -f 16 -f 26 -f 36 -f 46 -f 56 インバランス大 -f 12 +f 23 +f 24 +f 25 +f 26 -f 13 -f 23 +f 34 +f 35 +f 36 -f 14 -f 24 -f 34 +f 45 +f 46 -f 15 -f 25 -f 35 -f 45 +f 56 -f 16 -f 26 -f 36 -f 46 -f 56 スレッド0 24: 6 スレッド1 スレッド0 18:12 スレッド1 インバランスが緩和 加速率 =30/24 = 1.25 加速率 =30/18= 1.67

86 OpenMP 並列化例 ( まとめ ) 86 個別要素法 / 分子動力学法の例並列化時の検討項目 (1) 並列化するループの選択外側が望ましい (2) 並列化可能性 ( 計算の順番の依存性 ) の検討並列ループの各サイクルの実行順が 変わっても同じ結果か確認する (3) 変数のデータ共有属性の設定左辺の変数に注意し 必要に応じて PRIVATE や REDUCTION の宣言をする (4) スケジューリングの選択インバランスを緩和するようなスケジューリングを選択する!$OMP PARALLEL DO REDUCTION(+:f)!$OMP& PRIVATE(fij) SCHEDULE(STATIC,1) do i=1,n-1! 並列化するループ do j = i+1, n!! ループ変数は自動的に private となる fij = 1.d0/(x(j)-x(i))! fij の値は i に依存 要 private 化 f(i) = f(i) + fij f(j) = f(j) - fij! ここで j i の要素 f(j) を更新する! 総和の計算 要 reduction 変数化 複数 CPU/ ノードの機種 (cc-numa) の場合 ファーストタッチの検討も必要 ( 本講座では省略 )

87 並列化率とアムダールの法則 87 アムダールの法則オーバーヘッドを無視した理想的な条件でも速度向上率の上限は逐次部の割合 (1-p) で決まってしまいます 1-p 時間 逐次 逐次部 並列 逐次部 p 並列化済 1/(1-p) 倍が速度向上率の上限 並列化率 80% ( p = 0.8 ) ならば 1/0.2 = 5 倍が上限 予定の並列数にふさわしい並列化率以上である必要があります

88 並列化率とアムダールの法則 (cont.) 88 アムダール則による速度向上率 逐次部の割合 (1-p) が 1/( 並列数 ) 以下になるよう並列化を進めましょう アムダールの法則 速度向上率 (p: 並列化率,N: 並列数 ) 逐次部の割合 1-p = 0 ( 並列化率 100%) 1-p = 1/8 1-p = 1/4 1-p = 1/2 (88%) (75%) (50%) 並列数 (N)

89 情報源 89 OpenMP の仕様情報 OpenMP version 3.0 に関しては日本語訳あり 京 のコンパイラ : デフォルトは v3.0 準拠 (v3.1 準拠版も利用可 ) gcc 4.4 以降 :v3.0 準拠 (gcc 4.7 以降 v3.1 準拠 ) intel コンパイラ 11.0 以降 : v3.0 準拠 (12.1 以降 : v3.1 準拠, 13.1(XE 2013 Update 2) 以降 : v4.0 準拠 ) チュートリアル資料もあり ( 上記のページにリンクあり ) 参考資料 Fortran/C 利用者向け Using OpenMP,B. Chapman 他,The MIT Press Fortran 利用者向け OpenMPによる並列プログラミングと数値計算法, 牛島省, 丸善 C/C++ 利用者向け C/C++ プログラマーのためのOpenMP 並列プログラミング, 菅原清文, カットシステム OpenMP 入門 マルチコアCPU 時代の並列プログラミング, 北山洋幸, 秀和システム 本セミナーの資料は以下のページからダウンロード可 ( 随時更新 ):

90 90 おまけ Sections 構文特殊なデータ属性

91 Sections 構文 91 Sections 構文による並列化 処理 A 処理 B 処理 C 処理 D 処理の流れ Single Program, Multiple Data streams (SPMD) 処理 A,B,C,D の中のループが並列化不能でも 処理 A,B,C,D の間に依存性がなく独立に実行できるならば 並列に実行できます!$omp sections!$omp section 処理 A!$omp section 処理 B!$omp section 処理 C!$omp section 処理 D!$omp end sections 処理 A 処理 B 処理 C 処理 D 処理量のバラツキが大きいと並列化の効果が出にくくなります

92 92 特殊なデータ属性 FirstPrivate/LastPrivate 共有変数がある場合の注意 (Threadprivate 指示文 )

93 Firstprivate 属性 93 Firstprivate 指示節 - Private 変数と同様の属性を持ちますが 並列実行領域に入る直前の値で 各スレッドの値が初期化されます t = 2.0!$omp parallel do firstprivate(t) do i = 1, 4000 if (i.gt.nmax) t = 0.0 V(i) = X(i) + t * Y(i) プログラム開始 マスタースレッド 0 t= 2.0 V X Y shared(v, X, Y) マスタースレッド 0 t 0 = 2.0 スレッド 1 t 1 = 2.0 スレッド 2 t 2 = 2.0 スレッド 3 t 3 = 2.0 firstprivate( t )

94 Lastprivate 属性 94 Lastprivate 指示節 -Private 変数と同様の属性をもちますが 並列実行領域後に ループの逐次的な終値に相当する反復後の値が代入されます!$omp parallel do lastprivate(i) do i = 1, 4000 V(i) = X(i) + Y(i) V(i) = X(i)!!! i = 4001 プログラム開始 マスタースレッド 0 V X Y shared(v, X, Y) マスタースレッド 0 スレッド 1 スレッド 2 スレッド 3 i 0 i=1,1000 i 1 i=1001,2000 i 2 i=2001,3000 i 3 i=3001,4000 lastprivate( i ) マスタースレッド 0 i=4001 i=4000 の反復 ( 逐次実行した場合の最終に相当する反復 ) 終了後の値

95 共有変数がある場合の注意 95 COMMON ブロック /SAVE 変数 Threadprivate 指示文の説明

96 Threadprivate 指示文 96 以下のとき threadprivate 指示文を使います 複数のルーチンからアクセスする変数 (common ブロック変数 SAVE 変数 module 変数 ) がある かつ その変数が スレッドごとに異なる値を持つ必要がある (=shared 属性では ) ルーチン A 固有なデータ ルーチン B 固有なデータ スレッド 0 ルーチン A threadprivate 属性ルーチン A,B の共通データ 固有なデータ ルーチン B 固有なデータ shared 属性 並列実行領域内のすべてのスレッドからアクセス可能な共有データ スレッド 1 threadprivate 属性ルーチン A,B の共通データ 単に private 属性とすると 新たにスタック領域に変数 配列が確保され 複数のルーチンから共有できなくなってしまいます

97 Threadprivate 指示文 (cont.) 97 Threadprivate 指示文 (common ブロックの例 ) common ブロック内の変数を スレッド内で複数の subroutine からアクセスできる状態のまま private 化できます ( スレッドごとに固有の値を持つことができます ) 対象とする common ブロックの宣言の直後に記述します 対象が複数ある場合は コンマで区切って記述します 対象が宣言されている全てのプログラム単位 (subroutine 等 ) に記述します common ブロックの要素 equivalence 文に現れる変数は threadprivate 指示文で指定できません 指定された common ブロックの変数は 並列実行領域の終了後も存在し続け 次の並列実行領域でアクセスした時にも データの内容を保持しています common /com/ A, B!$omp threadprivate ( /com/ )

98 Copyin 指示節と copyprivate 指示節 98 Copyin 指示節 並列領域開始時の threadprivate 変数の初期化!$omp parallel copyin ( /com/ ) マスタースレッド以外のスレッドの threadprivate 変数は 自動的に初期化されません Copyin 指示節により 並列実行領域の開始時にマスタースレッドのデータの内容を各スレッドにコピーします Copyprivate 指示節 Single 領域 ( 並列領域内の逐次領域 ) 終了後の各スレッドへのデータ転送!$omp end single copyprivate ( /com/ ) Single 構文の終りに Single 実行スレッドの変数を 他のスレッドの対応する変数へデータをブロードキャスト ( コピー ) します

99 ThreadPrivate 指示文の使用例 99 2 つのルーチンが参照する common ブロックを threadprivate 化する例を示します メインルーチン : routine_a サブルーチン : routine_b program routine_a include 'omp_lib.h' common /com/id!$omp threadprivate ( /com/ )!$omp parallel id = omp_get_thread_num() call routine_b!$omp end parallel write(*,*)'2nd parallel region'!$omp parallel call routine_b!$omp end parallel end 並列実行領域 1 並列実行領域 2 subroutine routine_b common /com/id!$omp threadprivate ( /com/ ) write(*,*) id=, id end Threadprivate 変数 id は routine_a, routine_b の両方からアクセス可 変数 id の値はスレッドごとに異なる 2 つ目の並列実行領域でも各スレッドごとの値が保存される

100 おわり 100 ご清聴ありがとうございました

101 2018 年 10 月一般財団法人高度情報科学技術研究機構 ( 著作者 ) 本資料を教育目的等で利用いただいて構いません 利用に際しては以下の点に留意いただくとともに 下記のヘルプデスクにお問い合わせ下さい 本資料は 構成 文章 画像などの全てにおいて著作権法上の保護を受けています 本資料の一部あるいは全部について いかなる方法においても無断での転載 複製を禁じます 本資料に記載された内容などは 予告なく変更される場合があります 本資料に起因して使用者に直接または間接的損害が生じても 著作者はいかなる責任も負わないものとします 問い合わせ先 : ヘルプデスク helpdesk[-at-]hpci-office.jp([-at-] にしてください )

コードのチューニング

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

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

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

演習1: 演習準備

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

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション OpenMP 並列解説 1 人が共同作業を行うわけ 田植えの例 重いものを持ち上げる 田おこし 代かき 苗の準備 植付 共同作業する理由 1. 短時間で作業を行うため 2. 一人ではできない作業を行うため 3. 得意分野が異なる人が協力し合うため ポイント 1. 全員が最大限働く 2. タイミングよく 3. 作業順序に注意 4. オーバーヘッドをなくす 2 倍率 効率 並列化率と並列加速率 並列化効率の関係

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

2. OpenMP OpenMP OpenMP OpenMP #pragma#pragma omp #pragma omp parallel #pragma omp single #pragma omp master #pragma omp for #pragma omp critica

2. OpenMP OpenMP OpenMP OpenMP #pragma#pragma omp #pragma omp parallel #pragma omp single #pragma omp master #pragma omp for #pragma omp critica C OpenMP 1. OpenMP OpenMP Architecture Review BoardARB OpenMP OpenMP OpenMP OpenMP OpenMP Version 2.0 Version 2.0 OpenMP Fortran C/C++ C C++ 1997 10 OpenMP Fortran API 1.0 1998 10 OpenMP C/C++ API 1.0

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

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

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

NUMAの構成

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

More information

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

OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£²¡Ë 2013 5 30 (schedule) (omp sections) (omp single, omp master) (barrier, critical, atomic) program pi i m p l i c i t none integer, parameter : : SP = kind ( 1. 0 ) integer, parameter : : DP = selected real

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

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

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

03_Fortran_osx.indd

03_Fortran_osx.indd Fortran OpenMP* Fortran OpenMP* OpenMP* 9.0 1...2 2... 3 3 OpenMP*... 4 3.1... 4 3.2 OpenMP*... 5 3.3 OpenMP*... 8 4 OpenMP*... 9 4.1... 9 4.2... 10 4.3 OpenMP*... 10 4.4 OpenMP*... 11 4.5... 12 5 OpenMP*...

More information

Microsoft PowerPoint - 阪大CMSI pptx

Microsoft PowerPoint - 阪大CMSI pptx 内容に関する質問は katagiri@cc.u-tokyo.ac.jp まで 第 3 回 OpenMP の基礎 東京大学情報基盤センター 片桐孝洋 1 講義日程と内容について (1 学期 : 木曜 3 限 ) 第 1 回 : プログラム高速化の基礎 2013 年 4 月 11 日 イントロダクション ループアンローリング キャッシュブロック化 数値計算ライブラリの利用 その他第 2 回 :MPIの基礎

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

OpenMP 3.0 C/C++ 構文の概要

OpenMP 3.0 C/C++ 構文の概要 OpenMP 3.0 C/C++ 構文の概要 OpenMP API 仕様については www.openmp.org でダウンロードしてください OpenMP 実行宣言子は 後続の構造化ブロックや OpenMP 構文に適用されます 構造化ブロック () とは 単文または先頭に入口が 1 つ 末尾に出口が 1 つの複合文です parallel 構文はスレッドのチームを形成し 並列実行を開始します #pragma

More information

生物情報実験法 (オンライン, 4/20)

生物情報実験法 (オンライン, 4/20) 生物情報実験法 (7/23) 笠原雅弘 (mkasa@cb.k.u-tokyo.ac.jp) Table of Contents スレッドの使い方 OpenMP プログラミング Deadline The deadline is Aug 5 23:59 Your e-mail must have reached my e-mail box at the deadline time. It may take

More information

The 3 key challenges in programming for MC

The 3 key challenges in programming for MC コンパイラーによる並列化機能 ソフトウェア & ソリューションズ統括部 ソフトウェア製品部 Rev 12/26/2006 コースの内容 並列計算 なぜ使用するのか? OpenMP* 入門 宣言子と使用方法 演習 : Hello world と円周率の計算 並列プログラミング : ヒントとテクニック コード開発で避けるべきこと 2 並列計算なぜ並列処理を使用するのか? 計算をより短い時間で処理 一定の所要時間でより大きな計算を処理

More information

Microsoft PowerPoint - 阪大CMSI pptx

Microsoft PowerPoint - 阪大CMSI pptx 内容に関する質問は katagiri@cc.u-tokyo.ac.jp まで 第 3 回 OpenMP の基礎 東京大学情報基盤センター 片桐孝洋 1 講義日程と内容について (1 学期 : 木曜 3 限 ) 第 1 回 : プログラム高速化の基礎 2015 年 4 月 9 日 イントロダクション ループアンローリング キャッシュブロック化 数値計算ライブラリの利用 その他第 2 回 :MPIの基礎

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

Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, California 95054, U.S.A. All rights reserved. U.S. Government Rights - Commer

Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, California 95054, U.S.A. All rights reserved. U.S. Government Rights - Commer OpenMP API ユーザーズガイド Sun TM Studio 8 Sun Microsystems, Inc. 4150 Network Circle Santa Clara, CA 95054 U.S.A. 650-960-1300 Part No. 817-5813-10 2004 年 3 月, Revision A Copyright 2004 Sun Microsystems, Inc.,

More information

Microsoft PowerPoint - OS07.pptx

Microsoft PowerPoint - OS07.pptx この資料は 情報工学レクチャーシリーズ松尾啓志著 ( 森北出版株式会社 ) を用いて授業を行うために 名古屋工業大学松尾啓志 津邑公暁が作成しました 主記憶管理 主記憶管理基礎 パワーポイント 27 で最終版として保存しているため 変更はできませんが 授業でお使いなる場合は松尾 (matsuo@nitech.ac.jp) まで連絡いただければ 編集可能なバージョンをお渡しする事も可能です 復習 OS

More information

enshu5_4.key

enshu5_4.key http://www.mmsonline.com/articles/parallel-processing-speeds-toolpath-calculations TA : 菅 新 菅沼智史 水曜 新行紗弓 馬淵隼 木曜 情報知能工学演習V (前半第4週) 政田洋平 システム情報学研究科計算科学専攻 演習 V( 前半 ) の内容 第 1 週 : 高性能計算 (High Performance Computing

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

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

<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

並列計算導入.pptx

並列計算導入.pptx 並列計算の基礎 MPI を用いた並列計算 並列計算の環境 並列計算 複数の計算ユニット(PU, ore, Pなど を使用して 一つの問題 計算 を行わせる 近年 並列計算を手軽に使用できる環境が急速に整いつつある >通常のP PU(entral Processing Unit)上に計算装置であるoreが 複数含まれている Intel ore i7 シリーズ: 4つの計算装置(ore) 通常のプログラム

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

Fortran 勉強会 第 5 回 辻野智紀

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

More information

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

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

More information

Microsoft PowerPoint - 高速化WS富山.pptx

Microsoft PowerPoint - 高速化WS富山.pptx 京 における 高速化ワークショップ 性能分析 チューニングの手順について 登録施設利用促進機関 一般財団法人高度情報科学技術研究機構富山栄治 一般財団法人高度情報科学技術研究機構 2 性能分析 チューニング手順 どの程度の並列数が実現可能か把握する インバランスの懸念があるか把握する タイムステップループ I/O 処理など注目すべき箇所を把握する 並列数 並列化率などの目標を設定し チューニング時の指針とする

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

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

Microsoft PowerPoint - 09.pptx

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

More information

POSIXスレッド

POSIXスレッド POSIX スレッド (3) システムプログラミング 2011 年 11 月 7 日 建部修見 同期の戦略 単一大域ロック スレッドセーフ関数 構造的コードロッキング 構造的データロッキング ロックとモジュラリティ デッドロック 単一大域ロック (single global lock) 単一のアプリケーションワイドの mutex スレッドが実行するときに獲得, ブロックする前にリリース どのタイミングでも一つのスレッドが共有データをアクセスする

More information

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n を入力してもらい その後 1 から n までの全ての整数の合計 sum を計算し 最後にその sum

More information

about MPI

about MPI 本日 (4/16) の内容 1 並列計算の概要 並列化計算の目的 並列コンピュータ環境 並列プログラミングの方法 MPI を用いた並列プログラミング 並列化効率 2 並列計算の実行方法 Hello world モンテカルロ法による円周率計算 並列計算のはじまり 並列計算の最初の構想を イギリスの科学者リチャードソンが 1922 年に発表 < リチャードソンの夢 > 64000 人を円形の劇場に集めて

More information

Microsoft Word - VBA基礎(3).docx

Microsoft Word - VBA基礎(3).docx 上に中和滴定のフローチャートを示しました この中で溶液の色を判断する部分があります このような判断はプログラムではどのように行うのでしょうか 判断に使う命令は IF 文を使います IF は英語で もし何々なら という意味になります 条件判断条件判断には次の命令を使います If 条件式 1 Then ElseIf 条件式 2 Then ElseIf 条件式 3 Then 実行文群 1 実行文群 2 実行文群

More information

Microsoft Word - matlab-coder-code-generation-quick-start-guide-japanese-r2016a

Microsoft Word - matlab-coder-code-generation-quick-start-guide-japanese-r2016a MATLAB コードを使用した C コードの生成クイックスタートガイド (R2016a) 最初のスタンドアロン C コードの生成 スタンドアロン C コードを生成するには [ ビルド ] を [ ソースコード ] [ スタティックライブラリ ] [ ダイナミックライブラリ ] または [ 実行ファイル ] のいずれかに切り替えます MATLAB Coder を使用することで MATLAB コードから

More information

2. OpenMP におけるキーワード一覧 OpenMP の全体像を理解するために 指示文 指示節 実行時ライブラリ関数 環境変数にそれぞれどうようなものがあるのかを最初に示します 各詳細については第 4 章以降で説明します 2.1 OpenMP の指示文 OpenMPの指示文は プログラム内で並列

2. OpenMP におけるキーワード一覧 OpenMP の全体像を理解するために 指示文 指示節 実行時ライブラリ関数 環境変数にそれぞれどうようなものがあるのかを最初に示します 各詳細については第 4 章以降で説明します 2.1 OpenMP の指示文 OpenMPの指示文は プログラム内で並列 C 言語による OpenMP 入門 東京大学情報基盤センタープログラミング講習会資料 担当黒田久泰 1. はじめに OpenMP は非営利団体 OpenMP Architecture Review Board(ARB) によって規定されている業界標準規格です 共有メモリ型並列計算機用のプログラムの並列化を記述するための指示文 ライブラリ関数 環境変数などが規定されています OpenMP を利用するには

More information

NUMAの構成

NUMAの構成 メッセージパッシング プログラミング 天野 共有メモリ対メッセージパッシング 共有メモリモデル 共有変数を用いた単純な記述自動並列化コンパイラ簡単なディレクティブによる並列化 :OpenMP メッセージパッシング 形式検証が可能 ( ブロッキング ) 副作用がない ( 共有変数は副作用そのもの ) コストが小さい メッセージパッシングモデル 共有変数は使わない 共有メモリがないマシンでも実装可能 クラスタ

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プログラミング

OpenMPプログラミング OpenMP プログラミング入門 (Part 2) 講習の内容 :Part 2 OpenMP の概要について OpenMP API のご紹介 1. 並列実行領域 (Parallel Regions) 構文 2. ワークシェアリング (Worksharing) 構文 3. データ環境 (Data Environment) 構文 4. 同期 (Synchronization) 構文 5. 実行時関数 /

More information

演習準備

演習準備 演習準備 2014 年 3 月 5 日神戸大学大学院システム情報学研究科森下浩二 1 演習準備の内容 神戸大 FX10(π-Computer) 利用準備 システム概要 ログイン方法 コンパイルとジョブ実行方法 MPI 復習 1. MPIプログラムの基本構成 2. 並列実行 3. 1 対 1 通信 集団通信 4. データ 処理分割 5. 計算時間計測 2 神戸大 FX10(π-Computer) 利用準備

More information

ÊÂÎó·×»»¤È¤Ï/OpenMP¤Î½éÊâ¡Ê£±¡Ë

ÊÂÎó·×»»¤È¤Ï/OpenMP¤Î½éÊâ¡Ê£±¡Ë 2015 5 21 OpenMP Hello World Do (omp do) Fortran (omp workshare) CPU Richardson s Forecast Factory 64,000 L.F. Richardson, Weather Prediction by Numerical Process, Cambridge, University Press (1922) Drawing

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

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

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~ .NET プログラマー早期育成ドリル VB 編 付録文法早見表 本資料は UUM01W:.NET プログラマー早期育成ドリル VB 編コードリーディング もしくは UUM02W:.NET プログラマー早期育成ドリル VB 編コードライティング を ご購入頂いた方にのみ提供される資料です 資料内容の転載はご遠慮下さい VB プログラミング文法早見表 < 基本文法 > 名前空間の定義 Namespace

More information

生成された C コードの理解 コメント元になった MATLAB コードを C コード内にコメントとして追加しておくと その C コードの由来をより簡単に理解できることがよくありま [ 詳細設定 ] [ コード外観 ] を選択 C コードのカスタマイズ より効率的な C コードを生成するベストプラクテ

生成された C コードの理解 コメント元になった MATLAB コードを C コード内にコメントとして追加しておくと その C コードの由来をより簡単に理解できることがよくありま [ 詳細設定 ] [ コード外観 ] を選択 C コードのカスタマイズ より効率的な C コードを生成するベストプラクテ MATLAB コードを使用した C コードの生成クイックスタートガイド (R2012a) 最初のスタンドアロン C コードの生成 スタンドアロン C コードを生成するには MATLAB Coder のペインを [ ビルド ] に切り替えて [C/C++ スタティックライブラリ ] [C/C++ ダイナミックライブラリ ] または [C/C++ 実行ファイル ] のいずれかを選択しま MATLAB Coder

More information

1.overview

1.overview 村井均 ( 理研 ) 2 はじめに 規模シミュレーションなどの計算を うためには クラスタのような分散メモリシステムの利 が 般的 並列プログラミングの現状 半は MPI (Message Passing Interface) を利 MPI はプログラミングコストが きい 標 性能と 産性を兼ね備えた並列プログラミング 語の開発 3 並列プログラミング 語 XcalableMP 次世代並列プログラミング

More information

スライド 1

スライド 1 本日 (4/25) の内容 1 並列計算の概要 並列化計算の目的 並列コンピュータ環境 並列プログラミングの方法 MPI を用いた並列プログラミング 並列化効率 2 並列計算の実行方法 Hello world モンテカルロ法による円周率計算 並列計算のはじまり 並列計算の最初の構想を イギリスの科学者リチャードソンが 1922 年に発表 < リチャードソンの夢 > 64000 人を円形の劇場に集めて

More information

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用 RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用体型のローカル変数を文字列操作関数で操作する場合の注意事項 (RXC#013) 配列型構造体または共用体の配列型メンバから読み出した値を動的初期化に用いる場合の注意事項

More information

Java講座

Java講座 ~ 第 1 回 ~ 情報科学部コンピュータ科学科 2 年竹中優 プログラムを書く上で Hello world 基礎事項 演算子 構文 2 コメントアウト (//, /* */, /** */) をしよう! インデントをしよう! 変数などにはわかりやすい名前をつけよう! 要するに 他人が見て理解しやすいコードを書こうということです 3 1. Eclipse を起動 2. ファイル 新規 javaプロジェクト

More information

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 今回のプログラミングの課題 次のステップによって 徐々に難易度の高いプログラムを作成する ( 参照用の番号は よくわかる C 言語 のページ番号 ) 1. キーボード入力された整数 10 個の中から最大のものを答える 2. 整数を要素とする配列 (p.57-59) に初期値を与えておき

More information

また RLF 命令は 図 2 示す様に RRF 命令とは逆に 各ビットを一つずつ 左方向に回転 ( ローテイト ) する命令である 8 ビット変数のアドレスを A とし C フラグに 0 を代入してから RLF A,1 を実行すると 変数の内容が 左に 1 ビットシフトし 最下位ビット (LSB)

また RLF 命令は 図 2 示す様に RRF 命令とは逆に 各ビットを一つずつ 左方向に回転 ( ローテイト ) する命令である 8 ビット変数のアドレスを A とし C フラグに 0 を代入してから RLF A,1 を実行すると 変数の内容が 左に 1 ビットシフトし 最下位ビット (LSB) コンピュータ工学講義プリント (12 月 11 日 ) 今回は ローテイト命令を用いて 前回よりも高度な LED の制御を行う 光が流れるプログラム 片道バージョン( 教科書 P.119 参照 ) 0.5 秒ごとに 教科書 P.119 の図 5.23 の様に LED の点灯パターンが変化するプログラムを作成する事を考える この様にすれば 光っている点が 徐々に右に動いているように見え 右端まで移動したら

More information

講習No.9

講習No.9 日本語は通常 2 バイトの文字コード.JIS コード, シフト JIS コード, Unicode (UTF-8) 等の様々な文字コードがある. アスキーコード表 (ASCII code) アスキーコード ( 値 ) 漢字変換無しでキーボードから直接入力できる半角文字 32 48 0 64 @ 80 P 96 ` 112 p 33! 49 1 65 A 81 Q 97 a 113 q 34 " 50

More information

この方法では, 複数のアドレスが同じインデックスに対応づけられる可能性があるため, キャッシュラインのコピーと書き戻しが交互に起きる性のミスが発生する可能性がある. これを回避するために考案されたのが, 連想メモリアクセスができる形キャッシュである. この方式は, キャッシュに余裕がある限り主記憶の

この方法では, 複数のアドレスが同じインデックスに対応づけられる可能性があるため, キャッシュラインのコピーと書き戻しが交互に起きる性のミスが発生する可能性がある. これを回避するために考案されたのが, 連想メモリアクセスができる形キャッシュである. この方式は, キャッシュに余裕がある限り主記憶の 計算機システム Ⅱ 演習問題学科学籍番号氏名 1. 以下の分の空白を埋めなさい. CPUは, 命令フェッチ (F), 命令デコード (D), 実行 (E), 計算結果の書き戻し (W), の異なるステージの処理を反復実行するが, ある命令の計算結果の書き戻しをするまで, 次の命令のフェッチをしない場合, ( 単位時間当たりに実行できる命令数 ) が低くなる. これを解決するために考案されたのがパイプライン処理である.

More information

Microsoft Word - VBA基礎(6).docx

Microsoft Word - VBA基礎(6).docx あるクラスの算数の平均点と理科の平均点を読み込み 総点を計算するプログラムを考えてみましょう 一クラスだけ読み込む場合は test50 のようなプログラムになります プログラムの流れとしては非常に簡単です Sub test50() a = InputBox(" バナナ組の算数の平均点を入力してください ") b = InputBox(" バナナ組の理科の平均点を入力してください ") MsgBox

More information

PowerPoint Presentation

PowerPoint Presentation プログラミング基礎 第 2 週 (4,5,6 回 ) 2011-10-07 出村公成 この資料の再配布を禁止します 予定 プログラミング入門 (45 分 ) 変数 入出力 分岐 演習 (90 分 ) タッチタイプ練習 統合開発環境 Codeblocksの使い方 教科書例題の打ち込みと実行 プログラミング入門 C 言語の簡単な例を体験 変数 入出力 分岐 プログラムの例リスト 2.1 改 #include

More information

Microsoft PowerPoint - compsys2-06.ppt

Microsoft PowerPoint - compsys2-06.ppt 情報基盤センター天野浩文 前回のおさらい (1) 並列処理のやり方 何と何を並列に行うのか コントロール並列プログラミング 同時に実行できる多数の処理を, 多数のノードに分配して同時に処理させる しかし, 同時に実行できる多数の処理 を見つけるのは難しい データ並列プログラミング 大量のデータを多数の演算ノードに分配して, それらに同じ演算を同時に適用する コントロール並列よりも, 多数の演算ノードを利用しやすい

More information

memo

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

More information

JavaプログラミングⅠ

JavaプログラミングⅠ Java プログラミング Ⅰ 8 回目 for 文 今日の講義で学ぶ内容 for 文 変数のスコープ for 文の入れ子 繰り返し文 1 for 文 for 文最初に一度だけ初期化の式を処理します条件が true の場合 文を実行し 更新の式を処理して繰り返します条件が false の場合 for 文を終了します 条件は boolean 型で 関係演算子で表現される式などを記述します for( 初期化の式

More information

VelilogHDL 回路を「言語」で記述する

VelilogHDL 回路を「言語」で記述する 2. ソースを書く 数値表現 数値表現形式 : ss'fnn...n ss は, 定数のビット幅を 10 進数で表します f は, 基数を表します b が 2 進,o が 8 進,d が 10 進,h が 16 進 nn...n は, 定数値を表します 各基数で許される値を書くこ Verilog ビット幅 基数 2 進表現 1'b0 1 2 進 0 4'b0100 4 2 進 0100 4'd4 4

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

kiso2-09.key

kiso2-09.key 座席指定はありません 計算機基礎実習II 2018 のウェブページか 第9回 ら 以下の課題に自力で取り組んで下さい 計算機基礎実習II 第7回の復習課題(rev07) 第9回の基本課題(base09) 第8回試験の結果 中間試験に関するコメント コンパイルできない不完全なプログラムなど プログラミングに慣れていない あるいは複雑な問題は 要件 をバラして段階的にプログラムを作成する exam08-2.c

More information

Microsoft PowerPoint - ARCEMB08HayashiSlides.ppt [互換モード]

Microsoft PowerPoint - ARCEMB08HayashiSlides.ppt [互換モード] 演算 / メモリ性能バランスを考慮した CMP 向けオンチップ メモリ貸与法の提案 九州大学 林徹生今里賢一井上弘士村上和彰 1 発表手順 背景 目的 演算 / メモリ性能バランシング 概要 アクセスレイテンシの削減とオーバーヘッド 提案手法の実現方法 着目する命令 (Cell プロセッサへの ) 実装 性能評価 姫野ベンチマーク Susan@MiBench おわりに 2 チップマルチプロセッサ (CMP)

More information

ex05_2012.pptx

ex05_2012.pptx 2012 年度計算機システム演習第 5 回 2012.05.25 高水準言語 (C 言語 ) アセンブリ言語 (MIPS) 機械語 (MIPS) コンパイラ アセンブラ 今日の内容 サブルーチンの実装 Outline } ジャンプ 分岐命令 } j, jr, jal } レジスタ衝突 回避 } caller-save } callee-save 分岐命令 ( 復習 ) } j label } Jump

More information

<4D F736F F D20332E322E332E819C97AC91CC89F090CD82A982E78CA982E9466F E393082CC8D5C91A291CC90AB945C955D89BF5F8D8296D85F F8D F5F E646F63>

<4D F736F F D20332E322E332E819C97AC91CC89F090CD82A982E78CA982E9466F E393082CC8D5C91A291CC90AB945C955D89BF5F8D8296D85F F8D F5F E646F63> 3.2.3. 流体解析から見る Fortran90 の構造体性能評価 宇宙航空研究開発機構 高木亮治 1. はじめに Fortran90 では 構造体 動的配列 ポインターなど様々な便利な機能が追加され ユーザーがプログラムを作成する際に選択の幅が広がりより便利になった 一方で 実際のアプリケーションプログラムを開発する際には 解析対象となる物理現象を記述する数学モデルやそれらを解析するための計算手法が内包する階層構造を反映したプログラムを作成できるかどうかは一つの重要な観点であると考えられる

More information

Microsoft PowerPoint - sales2.ppt

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

More information

フローチャートの書き方

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

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

講習No.1

講習No.1 プログラムはどこに保存され, どこで実行されるのか? 復習 ハードディスク キーボード Central Processing Unit 例えば i7, ARM, Cortex-A17 ディスプレイ 例えば 4G バイト メモリ プログラムは, ワープロ文章などと同様, ハードディスクなどにファイルとして保存されている. プログラムは, メモリ上に呼び出されて ( ロード ) 実行される. プログラムの作成

More information

プレポスト【問題】

プレポスト【問題】 コース名 : 基礎から学ぶ!Excel VBA による業務の自動化 受講日 氏名 1 Excel VBA を使用するメリットとして誤っているものを 1 つ選びなさい 1. 手作業では手間のかかる作業も プログラムに記述した処理は一括して実行されるため 何段階ものメニュー操作を行う必要がなくなる 2. プログラムに書いた処理は記述どおりに実行されるため だれがいつ何回行っても確実な処理がなされ 誤動作を防ぐことができる

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

プログラミング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

PowerPoint プレゼンテーション

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

More information

Microsoft PowerPoint - 10.ppt [互換モード]

Microsoft PowerPoint - 10.ppt [互換モード] 第 10 回関数と再帰 1 今回の目標 再帰的な考え方に慣れる C 言語における再帰関数を理解する 階乗を求める再帰的な関数を作成し その関数を利用するプログラムを作成する 2 階乗 n! の 2 つの数学的表現 (1) 繰り返しによる表現 n! = 1 2 i n n = ii i= 1 ( n 1 のとき ) ( なお 0!=1) (2) 漸化式による表現 n! = 1 n = 0のとき n (

More information

Visual C++ 使用 C 言語 ワンポイント講座 デバッガで言語文法を理解する M.NET.SC デバッガで言語仕様 ( 文法 ) の実体 ( コンパイラの解釈と振る舞い ) を理解する プログラムでできることを習得する

Visual C++ 使用 C 言語 ワンポイント講座 デバッガで言語文法を理解する M.NET.SC デバッガで言語仕様 ( 文法 ) の実体 ( コンパイラの解釈と振る舞い ) を理解する プログラムでできることを習得する Visual C++ 使用 C 言語 ワンポイント講座 デバッガで言語文法を理解する M.NET.SC デバッガで言語仕様 ( 文法 ) の実体 ( コンパイラの解釈と振る舞い ) を理解する プログラムでできることを習得する 著作権について 本レポート及びソフトウェアは著作権法で保護されている著作物です 下記の点にご注意戴きご利用下さい 本レポートの著作権は丸山プログラミング塾に属します 著作権者の許可なく

More information

Microsoft PowerPoint - sales2.ppt

Microsoft PowerPoint - sales2.ppt 並列化の基礎 ( 言葉の意味 ) 並列実行には 複数のタスク実行主体が必要 共有メモリ型システム (SMP) での並列 プロセスを使用した並列化 スレッドとは? スレッドを使用した並列化 分散メモリ型システムでの並列 メッセージパッシングによる並列化 並列アーキテクチャ関連の言葉を押さえよう 21 プロセスを使用した並列処理 並列処理を行うためには複数のプロセスの生成必要プロセスとは プログラム実行のための能動実態メモリ空間親プロセス子プロセス

More information

memo

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

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

SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い

SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い ツールニュース RENESAS TOOL NEWS 2014 年 02 月 01 日 : 140201/tn1 SuperH RISC engine ファミリ用 C/C++ コンパイラパッケージ V.7~V.9 ご使用上のお願い SuperH RISC engine ファミリ用 C/C++ コンパイラパッケージ V.7~V.9の使用上の注意事項 4 件を連絡します 同一ループ内の異なる配列要素に 同一の添え字を使用した場合の注意事項

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション Excel VBA の基本 1 VBA Visual Basic for Applications Office シリーズに搭載されているプログラミング言語 マクロを作成するために使われる 1 プログラミングとは 人間の意図した処理を行うようにコンピュータに指示を与えること セル A1 の内容をセル B1 にコピーしなさいセル A1 の背景色を赤色にしなさいあれをしなさいこれをしなさい 上から順番に実行

More information

COMET II のプログラミング ここでは機械語レベルプログラミングを学びます 1

COMET II のプログラミング ここでは機械語レベルプログラミングを学びます 1 COMET II のプログラミング ここでは機械語レベルプログラミングを学びます 1 ここでは機械命令レベルプログラミングを学びます 機械命令の形式は学びましたね機械命令を並べたプログラムを作ります 2 その前に プログラミング言語について 4 プログラミング言語について 高級言語 (Java とか C とか ) と機械命令レベルの言語 ( アセンブリ言語 ) があります 5 プログラミング言語について

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

sinfI2005_VBA.doc

sinfI2005_VBA.doc sinfi2005_vba.doc MS-ExcelVBA 基礎 (Visual Basic for Application). 主な仕様一覧 () データ型 主なもの 型 型名 型宣言文字 長さ 内容 整数型 Integer % 2 バイト -32,768 32,767 長整数型 Long & 4 バイト -2,47,483,648 2,47,483,647 単精度浮動小数点数 Single 型!

More information

Microsoft Word ●IntelクアッドコアCPUでのベンチマーク_吉岡_ _更新__ doc

Microsoft Word ●IntelクアッドコアCPUでのベンチマーク_吉岡_ _更新__ doc 2.3. アプリ性能 2.3.1. Intel クアッドコア CPU でのベンチマーク 東京海洋大学吉岡諭 1. はじめにこの数年でマルチコア CPU の普及が進んできた x86 系の CPU でも Intel と AD がデュアルコア クアッドコアの CPU を次々と市場に送り出していて それらが PC クラスタの CPU として採用され HPC に活用されている ここでは Intel クアッドコア

More information

4-4 while 文 for 文と同様 ある処理を繰り返し実行するためのものだが for 文と違うのは while 文で指定するのは 継続条件のみであるということ for 文で書かれた左のプログラムを while 文で書き換えると右のようになる /* 読込んだ正の整数値までカウントアップ (for

4-4 while 文 for 文と同様 ある処理を繰り返し実行するためのものだが for 文と違うのは while 文で指定するのは 継続条件のみであるということ for 文で書かれた左のプログラムを while 文で書き換えると右のようになる /* 読込んだ正の整数値までカウントアップ (for 4-4 while 文 for 文と同様 ある処理を繰り返し実行するためのものだが for 文と違うのは while 文で指定するのは 継続条件のみであるということ for 文で書かれた左のプログラムを while 文で書き換えると右のようになる /* 読込んだ正の整数値までカウントアップ (for 文 ) */ int i, no; for (i = 0; i

More information

Microsoft PowerPoint - 11.pptx

Microsoft PowerPoint - 11.pptx ポインタと配列 ポインタと配列 配列を関数に渡す 法 課題 : 配列によるスタックの実現 ポインタと配列 (1/2) a が配列であるとき, 変数の場合と同様に, &a[0] [] の値は配列要素 a[0] のアドレス. C 言語では, 配列は主記憶上の連続領域に割り当てられるようになっていて, 配列名 a はその配列に割り当てられた領域の先頭番地となる. したがって,&a[0] と a は同じ値.

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション 配列とコレクション 配列の使い方 固定配列 動的配列 コレクションの使い方 今日の目的 固定配列の宣言例 プロシージャレベル Dim arybuf(0 To 5) As Long モジュールレベル Private arybuf(0 To 5) As Long Public arybuf(0 To 5) As Long 固定配列の宣言例 プロシージャレベル Dim arybuf(0 To 5) As

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

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

JavaプログラミングⅠ

JavaプログラミングⅠ Java プログラミング Ⅰ 6 回目 if 文と if else 文 今日の講義で学ぶ内容 関係演算子 if 文と if~else 文 if 文の入れ子 関係演算子 関係演算子 ==,!=, >, >=,

More information

プログラミング実習I

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

More information

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

書式に示すように表示したい文字列をダブルクォーテーション () の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf( 情報処理基礎 ); printf(c 言語の練習 ); printf 情報処理基礎 C 言語についてプログラミング言語は 1950 年以前の機械語 アセンブリ言語 ( アセンブラ ) の開発を始めとして 現在までに非常に多くの言語が開発 発表された 情報処理基礎で習う C 言語は 1972 年にアメリカの AT&T ベル研究所でオペレーションシステムである UNIX を作成するために開発された C 言語は現在使われている多数のプログラミング言語に大きな影響を与えている

More information