KOBE HPC サマースクール（初級）2021 講義資料
2021/09/06
兵庫県立大学 情報科学研究科
安田 修悟

スタッフ
• 講師
– 横川先生（神大・ECCSE），寺尾先生（理研・R-CCS），安田（兵県大・情報科学）• アシスタント– 清水，中井，上本，中澤（神大）
木村，谷口，柳生（兵県大）• 計算機・アカウント管理– 島，安田（兵県大・情報科学）

2

講義内容
1. 計算機サーバーの環境設定と使い方
2. シリアルプログラムの高速化
3. 熱伝達問題の差分計算
4. スレッド並列とは
5. OpenMPによるループ処理の並列化
6. 差分化された偏微分方程式の並列化
7. アムダール法則と並列化効率の評価
8. 分散メモリ型並列計算機とは何か？
9. 1対1通信関数、集団通信関数
10. 並列計算性能の評価方法
11. 熱伝導問題のプロセス並列計算
12. ハイブリッド並列
13. アクセラレータとは
14. OpenACCプログラミング
15. まとめと確認テスト（担当 安田）（担当 寺尾）（担当 横川）（担当 安田）3神戸大学・三宅先生から提供して頂いた資料

Zoom講義の進め方

4

Zoom基本機能を確認しましょう！
1. 聴講中（発言時以外）はミュートしましょう．
2. 参加者は名前を，「受講番号（２桁）_氏名」として下さい．（入室
後に「名前の変更」機能で修正可能です） ．

3. 質問や声が聞こえないなどの場合は，チャットで伝えてください．
遠隔授業TAが対応します．「全員宛て」にして書き込んでください．

4. 「挙手」機能を確認しましょう．

5

1.

ミュートしましょう．
発言するときミュートを解除してください．
発言終了時には再びミュートしてください．

それぞれクリックすることで，・ ミュート / ミュート解除
・ ビデオ開始 / ビデオ停止
を切り替えられます．

6

2.

自分の氏名を確認しましょう．
② 参加者のリストの中に＊＊＊（自分）が表示されます．

① 「参加者」をクリック

7

2.

「名前の変更」が必要な場合． （手順２）③ 「詳細」をクリックして，「名前の変更」を選ぶ④ 名前を入力※本名でお願いします8

3.

声が聞こえないなどの場合は，チャットで伝えてください．

② チャット画面が開きます．

① 「チャット」をクリック③ ここにメッセージを入力
9
遠隔授業TAが読めるよう「全員」を送信先にして、書き込んでください．

4.

「挙手」機能を確認しましょう．

「手を挙げる」をクリック
同様に「手を降ろす」ことができる

10

質問がある時
1. 直接口頭で質問 or 挙手をしてください．
2. 講師又はTAが応答します．
3. 必要に応じてTAと個別のチャットで対応します．
4. さらに必要に応じて，ブレークアウトルーム（BOR）
へ誘導します．

11

計算機資源について

12兵庫県大・情報科学キャンパス
計算機サーバシステム概要
ログインサーバー

計算ノード

ファイルサーバ
13

計算機サーバシステム概要
Host
フロントエンドサーバ rokko1
rokko2

SystemCPU/Accelerator

MemoryHPE ProLiantDL380 Gen10Intel Xeon Gold 6248
2.5GHz (20cores x2)

768GB

CPUノード(Thin/Fatノード)

node01~56
nodef01~08

HPE Apollo
2000 Gen10Intel Xeon Gold 6248
2.5GHz (20cores x2)

192GB (Thin)/
768GB (Fat)GPUノード（gpu搭載ノード）

nodeg01

HPE Apollo
6500 Gen10Intel Xeon Gold 6248
2.5GHz (20cores x2) /NVIDIA V100 32GB
SXM2 x8

768GB

VEノード
（VE搭載ノード）

nodev01~02

HPE Apollo
6500 Gen10Intel Xeon Gold 6248
2.5GHz (20cores x2) /NEC Vector Engine
Accelerator Module x8

768GB

共有メモリノード

kofuji

HPE ProLiant
DL560 Gen10Intel Xeon Gold 6248
2.5GHz (20cores x2)x4 (Total 80cores)

3TB

14

フロントエンドサーバ(rokko)へのログイン• アカウント名“guest受講者番号（2桁）”となっています．
例： guest01, guest31, ...
• ログインパスワードはアカウント名と同一です．
• インターネットによる接続方法は島先生による資料を参考にしてください．

15

プログラミング環境設定• moduleコマンド– Module環境のロード／アンロード
module␣load␣intel / module␣unload␣intel– 現在の設定
module␣list– 利用可能なmoduleの確認
module␣avail– Module環境の初期化
module␣purge• 「利用者マニュアル_rev1.2」の12頁参照（マニュアルは当日に送付します．）

16

プログラミング環境設定
1. “.module”ファイルの作成> vim␣.module
source␣/etc/profile.d/modules.shmodule␣load␣intel

2. “~/.bashrc”の最下部に次の1行を追記．
> vim␣.bashrc.␣~/.module

3. 端末に “bash”と入力. エラーが無ければOK.
17

プログラミング環境• コンパイラ（「利用者マニュアル」30頁以降）– Intelicc␣-O3␣hello.c␣-o␣hello.out
オプション

実行ファイルの指定• 実行はPBSジョブ管理システムを使います．
（「利用者マニュアル」14頁）– ジョブスクリプトの利用
qsub␣<ジョブスクリプト>– インタラクティブジョブ
qsub␣-I
18

PBSジョブ管理システム• バッチスクリプトの作成
vim␣sample.sh/tmp/khpc2021/20210906/sample.sh#!/bin/bash#PBS␣-q␣S#PBS␣-I␣select=1:ncpus=1#PBS␣-N␣sample_job#PBS␣-j␣oe

・キューの指定・計算リソースの指定
・任意のジョブ名の指定
・標準出力と標準エラー出力を統合

cd␣${PBS_O_WORKDIR}

・投入ディレクトリに移動

echo “Hello sample job.”

・ジョブ内で実行するコマンド• ジョブ投入qsub␣sample.sh19

PBSジョブ管理システム• キュー構成

20

PBSジョブ管理システム• 結果表示cat␣sample_job.o<ジョブID>• 実行ジョブの確認 （「利用者マニュアル」28頁）
qstat• ジョブのキャンセル（「利用者マニュアル」29頁）
qdel␣<ジョブID>
21

PBSジョブ管理システム• インタラクティブキュー
– qsub␣-I␣-q␣T クラスタノードにログイン．
“-q”で利用するキューの指定．
– Job IDが割り当てられる．qstatで確認．
– 作業ディレクトリに移動して作業を実行
module␣load␣intel
icc␣hello.c./a.out– exit コマンドで終了．（ノードからログアウト．）
必ずexitでログアウトして下さい!!

22

演習0
• hello.cをインタラクティブキューを使って実行する．
1. qsub -I -q T
2. cd 作業ディレクトリ
3. icc hello.c -o hello.out
4. ./hello.out•

バッチスクリプトを使って実行する．

23

（補足）環境構築• GUI(Graphical User Interface) と CUI(Character
User Interface)– スパコンではCUIの操作が必須。

• Linuxコマンド– WindowsではCygwinとMacではターミナルを使う。

24

Cygwinのインストール（Windows）
a. http://www/cygwin.com/からインストーラをダウンロード
b. インストーラを起動。「Chose Installation Type」で[「Installfrom Internet」を選択。Cygwin Mirror Sitesにある日本のサイト（例えば、http://ftp.jaist.ac.jp）を選択し、「次へ」。
c. パッケージの取得。「Select Package」で「View」を「Full」に設定、「Search」を使って、”gcc-core”と”nedit”を探す。
“gcc-core”と”nedit”の「New」の欄のプルダウンを使って、「Skip」を最新のバージョンに変更。
d. 次に「View」を「Category」に変更して、表示される一覧から”X11”のプルダウンを”Install”に変更。
e. 「次へ」をクリックしてインストールの完了を待つ。
25

Cygwinのインストール（Windows）
f. インストールが完了したら、Cygwinを開いて、ターミナルにgcc –vと入力。バージョンなどの情報が返ってきたらOK。
g. Cygwinのサイトからダウンロードしたインストールファイル（
setup-x86_64）を使うと、Packageの追加やアンインストー
ルなどが出来るのでそのまま残すと便利。

26

homebrewによる環境構築（Mac）
a. Homebrewのインストール。以下参考サイト。
https://brew.sh/index_ja
https://fukatsu.tech/homebrew
https://qiita.com/pypypyo14/items/4bf3b8bd511b6e93c9
f9
b. AquaTermのインストール。
https://sourceforge.net/projects/aquaterm/c. X11のインストール。 https://www.xquartz.org

27homebrewによる環境構築（Mac）
f. ターミナルで次を入力してgccをインストール。
brew install gcc
g. インストールが完了したら、ターミナルに”gcc -v”と入力して、バージョンなどの情報が表示されればOK。
h. 次に、neditをインストール。
brew install nedit
ターミナルに”nedit “と入力してエディタが起動すればOK。

28

CygwinCygwinを使おう
スタートメニュー→ Cygwin-X→Xwin server
でXサーバを起動

29

Cygwin
Xtermの起動
Xwin Server→ システムツール→ Xterm

30

Cygwin エディタの起動
この中でnedit␣&⏎と入力。

31

入力・コンパイル・実行#include␣<stdio.h>⏎⏎int␣main(int␣argc,␣char␣*argv[]){⏎
printf("Hello,␣world¥n");⏎return␣0;⏎}⏎
入力しよう⏎：改行を表す␣:スペースを表す
エディタの中では¥はバックスラッシュになる
32入力・コンパイル・実行
1.ファイル名(hello.c)を入力し2.OKを押す

保存しよう
File -> Save As
33

入力・コンパイル・実行
この窓の中で、
gcc␣hello.c⏎とすると、a.exeという実行ファイルが出来る。
これを実行するには./a.exe⏎
普通のLinuxでは、a.exeではなく、a.outという実行ファイルができる34

Gnuplotの起動• Cygwinのsetupファイル又はHomebrewを使ってgnuplotをインストール。
• ターミナルでgnuplotを起動して、plot␣sin(x) ⏎Macの場合35

x11アプリ• x11転送– Cygwin/X (Win)又はXquartz (Mac)を起動– ”-Y”オプション
ssh –Y –i ~/.ssh/id_rsa_guest40 –p 33033 guest40@fmd.sim.u-hyogo.ac.jp• サーバーでx11アプリケーションを起動– xclock36

トンネリング• fmdに接続する時に下記オプションを追加．
-L （ローカルポート指定):172.25.61.33:22• fmdから見えるIPアドレス172.25.61.33の22ポートと指定した（ローカルポート）が繋がります．

ローカルポート11011番とrokko1の22番ポート(172.25.61.11:22)が踏み台サーバをトンネルして繋がります．

• 接続を確保するため xclockでも起動させておく．
37

トンネリング• ターミナルを起動して，
ssh –Y アカウント@localhost –p 11011• rokko1のx11アプリを起動.

38

シリアルプログラムの高速化

39

計算機の基本構造• フォン・ノイマン型 (von Neumann architecture)
制御装置

入力

演算装置

主記憶装置

CPU（中央処理装置）

出力1. 主記憶装置（メモリ），1次元のアドレス空間をもつ，
2. 命令とデータがともに記憶装置に記憶される．
3. 演算は制御装置からの命令信号によって実行される．
4. 命令は，プログラムカウンタにより逐次的に実行される． 40

計算機の動作原理• チューリングマシン
１．無限に長いテープ・・・・・・・・・・・・・・

２．ヘッダ（情報の読み書き）
３．内部状態メモリ• テープの情報の読み書き．
• 機械の内部状態の変更．
• ヘッドの移動．

• ノイマン型
メモリ
命令１ 命令２ データ 命令３
番地
0
1
2
3

4

命令４ 命令５ データ データ データ
56
7
8
9 ....

プログラムカウンタ −＞ 実行する命令の番地を示す

0 1 3 5 61

※分岐命令でカウンタを書き換える．

41

並列計算機• 並列計算機の種類
SMP（共有メモリ型）
Core

Core

Core

Core

Cach
e

Cach
e

Cach
e

Cach
e

MemorySMP Cluster

Node

MemoryMemoryMemoryMemoryInterconnetc / Network

Memory42

並列計算• 並列計算・・・演算を分割して、複数のプロセッサに割り当てて処理する– プロセス並列• 分割された演算（プロセス）が、それぞれ独立のメモリ空間を参照
する。
• プロセス間にデータ転送が必要。

– スレッド並列• 分割された演算（スレッド）は、メモリ空間を共有できる（複数のスレッドで変数を共有できる）。
• 各スレッドは他のスレッドからはアクセスできない固有の変数も用
意できる。

43

逐次計算の高速化
l ループ展開l 繰り返し処理で毎回発生する終了条件のチェックの低減
l ループ制御のカウンタやポインタの更新回数の低減
行列積の計算for(i=0;i<IMAX;i++)for(j=0;j<IMAX;j++)for(k=0;k<IMAX;k++)c[i][j]+=a[i][k]*b[k][j];

2つ目のループについて展開
for(i=0;i<IMAX;i++)for(j=0;j<IMAX;j+=8)
for(k=0;k<IMAX;k++){c[i][j]+=a[i][k]*b[k][j];c[i][j+1]+=a[i][k]*b[k][j+1];
c[i][j+2]+=a[i][k]*b[k][j+2];
c[i][j+3]+=a[i][k]*b[k][j+3];
c[i][j+4]+=a[i][k]*b[k][j+4];
c[i][j+5]+=a[i][k]*b[k][j+5];c[i][j+6]+=a[i][k]*b[k][j+6];
c[i][j+7]+=a[i][k]*b[k][j+7];}44

逐次計算の高速化
l 一時変数の活用
l ループ内で同じ変数へのアクセスが多い場合，一時変数を用いると冗長な命令を省く事ができる．
for(i=0;i<IMAX;i++)for(j=0;j<IMAX;j+=8)
for(k=0;k<IMAX;k++){c[i][j]+=a[i][k]*b[k][j];c[i][j+1]+=a[i][k]*b[k][j+1];
c[i][j+2]+=a[i][k]*b[k][j+2];
c[i][j+3]+=a[i][k]*b[k][j+3];
c[i][j+4]+=a[i][k]*b[k][j+4];
c[i][j+5]+=a[i][k]*b[k][j+5];c[i][j+6]+=a[i][k]*b[k][j+6];
c[i][j+7]+=a[i][k]*b[k][j+7];}
配列a[i][k]へ冗長なアクセス

for(i=0;i<IMAX;i++)for(j=0;j<IMAX;j+=8)
for(k=0;k<IMAX;k++){t=a[i][k];c[i][j]+=t*b[k][j];c[i][j+1]+=t*b[k][j+1];
c[i][j+2]+=t*b[k][j+2];
c[i][j+3]+=t*b[k][j+3];
c[i][j+4]+=t*b[k][j+4];
c[i][j+5]+=t*b[k][j+5];c[i][j+6]+=t*b[k][j+6];
c[i][j+7]+=t*b[k][j+7];}45

演習1 (ex01.c)• ループ展開無し，ループ展開で2回処理，4回処理，8回処理の場合について実行速度を比較せよ．
• ループ展開で8回処理した後に，さらに一時変数を用いることで実行速度が速くなるか確認せよ．
※コンパイルオプションを”-O0”（最適化無し）としてコンパイルする．

46

逐次計算の高速化• キャッシュメモリ– データアクセスの時間を短縮する．

CPU

CORE

命

令

データ

データ

キャッシュ：小容量，高速処理

低転送速度
命

令 データ データ データ データ 命

令 データ データ 命

令

主記憶装置（メモリ）：大容量，1次元アドレス空間
番地で区切られたデータ量をメモリとキャッシュでやりとりする．
47

逐次計算の高速化
1. 水平参照と垂直参照– 水平参照の方がキャッシュミスが少ない．
2次元配列 A[I][J]0

A[i][j]は1次元メモリ空間で 𝑖×𝐽𝑀𝐴𝑋 + 𝑗 番目のデータ.
1

J

2

3

....... J - 4 J - 3 J - 2 J - 1

J + 1 J + 2 J + 3 ....... 2J-4 2J-3 2J-2 2J-1
....

....
[i][j]

A[i][j]のデータが必要な場合，その前後のデータをまとめキャッシュにあげる．
48
FortranではA(i,j)は𝑗×𝐼𝑀𝐴𝑋 + 𝑖の順番になるので注意!!

逐次計算の高速化
キャッシュヒット

2. サブブロック分割

0
J

1

2

3

キャッシュ
ミス

....... J - 4 J - 3 J - 2 J - 1

J + 1 J + 2 J + 3 ....... 2J-4 2J-3 2J-2 2J-1
....

....

49

演習2
• 2つの高速化処理についてベンチマーク実行．
（コンパイルの最適化オプションは “-O0”を指定）
a. 垂直参照と水平参照の比較
ex02a.cを水平参照のコードに改良せよ．
b. 垂直参照とサブブロック分割の比較．
ex02b.cでoffsetのサイズを変更して比較せよ．
offset=4, 8, 16, 32, 64, 128

50

演習3
• 事前読込（プリフェッチ）処理- ex01.cではkについてのループで配列b[k][j]に毎回キャッシュミスが起こる．ex03.cでは配列b[k][j]について事前読込することで，キャッシュミスを低減させている．
- ex01.cとex03.cを比較して事前読込処理についてベンチマーク．

※コンパイルオプションを”-O0”（最適化無し）としてコンパイ
ルする．
51

熱伝達問題の差分計算

52

連立一次方程式の解法1• ヤコビの反復法（Jacobi method)53• ヤコビの反復法の形式

xi = c0 x0 + c1 x1 +.... + ci−1 xi−1 + ci+1 xi+1 +.... + cN x N
1. x のi成分について，成分i以外のベクトル要素の線形結合で表す．
2. i=0,…,NのN+1個の連立一次方程式を反復法で解く．
54

• ヤコビ反復法 （３×３行列）
非対角成分を除いて
右辺に移行

55

• ヤコビの反復法（３×３行列）

適当な初期値を使って反復計算を実行．

解が収束するまで反復する．
(x,y,z)が収束する場合には、その値は連立一次方程式の解を与える．
56

• ヤコビの反復法 （３×３行列）– 収束判定の例

元の方程式との残差を求めて十分小さくなるまで反復する．
サンプルコード yacobi_3by3.c57

連立一次方程式の解法2• LU分解による解法
行列Aを下三角行列L（対角成分は１）と上三角行列Uに分解する。
（LU分解の方法は補足資料を参照．）

A = LU
Aが3X3行列の場合：

! a
# 11
# a21
##
" a31

a12
a22
a32

a13 $ ! 10
& #a23 & = # b21 1&& ##a33 % " b31 b32$!
0 &# c11 c12
0 &# 0 c22&&##
1 %" 0
0

c13 $
&
c23 &
&&
c33 %

58

連立一次方程式の解法2! !
連立一次方程式 Ax = y! !
• LU分解を行う。 LU x = y※LU分解の方法については補足資料参照．

!
!
! !
• z = U x と置くと、 Lz = y と書ける。
! z $ ! cc
# 1 & # 11 12# z2 & = # 0 c22
##
&& ##
z
0
" 3 % " 0c13 $! x1 $
&#
&
&
#
c23
x2 &
&#
&
c33 &%#" x3 &%!
0# 1# b21 1##
" b31 b32

$ !
$$!
0 &# z1 & # y1 &0 &# z2 & = # y2 && #&&#1 &%#" z3 &% #" y3 &%59

連立一次方程式の解法2! !
連立一次方程式 Ax = y
解法の手順
! !
!
1. Lz = y を解いて、 z を求める。
!
! !
2. U x = z を解いて、元の方程式の解 x を求める。

60

連立一次方程式の解法2! !
!
1. Lz = y を解いて、 z を求める。
!
0# 1# b21 1##
" b31 b32$! z $ ! y $0 &# 1 & # 1 &0 &# z2 & = # y2 && #&&#1 &%#" z3 &% #" y3 &%(1) z1 = y1
(2) z2 = y2 − b21z1(3) z3 = y3 − b31z1 − b21z2

z1から順次，z2, z3と求められる。
61

連立一次方程式の解法22.

! !
U x = z を解いて、元の方程式の解! cc# 11 12# 0 c22##0" 0!
x を求める。

c13 $! x1 $ ! z1 $&#& #&c23 &# x2 & = # z2 &&#& #&c33 &%#" x3 &% #" z3 &%(1) x3 = z3 / c33(2) x2 = (z2 − c23 x3 ) / c22

x3，x2, x1と順次，求められる。

(3) x1 = (z1 − c12 x2 − c13 x3 ) / c11

62

演習４
• サンプルコード(ex04_1.cとex04_2.c）を使って，次の連立一次方程式を解きなさい．
" 5
$
$ 0
$ 1
$ 1
$
$ 1
#

1 2 0
2 −1 11 3 0
0 0 1
0 −1 0" x % "%
−1 $ 1 '
5 %
'$
$
'
'
x
2 '
2
$ 0 '
$
'
1 '$ x3 ' = $ −2 '0 '$ x4 ' $ 0 '
'$
$
'
'
'
$
5 &$ x ' # 4 '&
# 5 &

63

（補足）LU分解の方法

A = LU
Aが3X3行列の場合：
! a
# 11
# a21
##
" a31

a12
a22
a32

a13 $ ! 10
& #a23 & = # b21 1& #a33 &% #" b31 b32$!
0 &# c11 c12
0 &# 0 c22&#
1 &%#" 0
0

c13 $
&
c23 &
&
c33 &%

具体的に書くと、

! a
# 11
# a21
##
" a31

a12
a22
a32

a13 $ ! c11
c12& #a23 & = # b21c11
b21c12 + c22&& ##a33 % " b31c11 b31c12 + b32 c22$&&
b21c13 + c23&&
b31c13 + b32 c23 + c33 %c1364

（補足）LU分解の方法
1. 行列Aを次のようにA’に変換する。

# a
a12
11
%
A! = % a21 / a11 a22 − a!21a12%%! a12$ a31 / a11 a32 − a31

L, U成分での表現は？

& # c
c12
( % 11a23 − a!21a13 ( ⇒ % b21
c22( %! a13 (' %$ b31 b32 c22
a33 − a31
a13

&
(
(
c23
(
b32 c23 + c33 ('c13

2. 行列A’をさらに次のようにA’’変換するとL，Uの全ての要素が決定する。

# a!
% 11
A!! = % a!21
%%
!
$ a31

!
a12
a!22
! / a!22
a32

& # c
c
( % 11 12( ⇒ % b21 c22
a!23
(( %%
! − a32!! a!23 ' $ b31 b32
a33
!
a13

c13 &
(
c23 (
((
c33 '
65

（補足）LU分解の方法
! a
! a1N
# 11
# " # "
## a
! aNN
" N1

$
&
&
&&
%

" c
c12
$ 11
$ b21 c22$
$ " #$ bN1 !
#

!
#
bNN−1

c1N %
'
c2 N ''" 'cNN '&

行列AをLU分解の要素行列に変換するプログラム。
for(k=0;k<N-1;k++){w=1/a[k][k];for(i=k+1;i<N;i++){a[i][k] *= w;
for(j=k+1;j<N;j++){a[i][j] -= a[i][k]*a[k][j];}}}サンプルコード lu_decomp.c※ U行列の対角成分cii にゼロや小さな値が出てくる場合には、更に、行や列の入れ替えを伴う複雑な手順を考える必要がある。

66

熱伝達問題の差分解法• 温度場を計算する。（ラプラス方程式）

−Δ𝑇 =

!!"
!# !

+

!!"
!$ !

= 10

T=0

T=0

T=0

y
x

T=0
67

• 温度場を計算する。（ラプラス方程式）

−Δ𝑇 =

!!"
!# !

+

!!"
!$ !

= 10

• 差分化する。
𝑇 𝑥) , 𝑦* = 𝑇),* ,𝑖𝑥) = 𝑦) =𝑖 = 0, … , 𝑁 ,𝑁
Δℎ = 1/𝑁
68• 温度場を計算する。（ラプラス方程式）

−Δ𝑇 =

!!"
!# !

+

!!"
!$ !

= 10

• 差分化する。

1
𝑇!,# = 10Δℎ$ + 𝑇!%&,# + 𝑇!'&,# + 𝑇!,#%& + 𝑇!,#'&
4(𝑖, 𝑗 = 1, … , 𝑁 − 1)69• 𝑇),* の線形連立方程式

𝑇(,# = 𝑇),# = 0, 𝑗 = 0, … , 𝑁
𝑇!,( = 𝑇!,) = 0, (𝑖 = 0, … , 𝑁)

境界条件
として固定

ヤコビの反復法
1
(-)
(-)
(-)
(-)
1
= 10Δℎ + 𝑇)2/,* + 𝑇)./,* + 𝑇),*2/ + 𝑇),*./
4(𝑖, 𝑗 = 1, … , 𝑁 − 1)
(-./)
𝑇),*

サンプルコード laplace.c70ベクトル化• SIMD（Single Instruction Multiple Data）– 1命令で複数要素の演算を行う．

for(i=0;i<n;i++){C[i]=A[i]+B[i];}• [SSE]: float4要素を一度に計算• [AVX]: float8要素• [AVX-512]: float 16要素

A[0]

A[1]

A[2]

A[3]

+ B[0]

B[1]

B[2]

B[3]

C[0]

C[1]

C[2]

C[3]
71

コンパイラーによるベクトル化• ループの自動ベクトル化（-xまたは-axオプション）– 最適化レポート（-qopt-reportオプション）でベクトル化状
況を確認
icc -xhost laplace.c -qopt-report– -xhost: コンパイルを行うホスト・プロセッサーで利用可能な最上位の命令セット向けのコードを生成.
– laplace.optrptにベクトル化状況を報告.
– -no-vec: コンパイラーによるベクトル化を無効にする．
72

演習5• 熱伝達問題のコードを使って以下を実施せよ．
– SIMD命令の効果の確認．
ベクトル化を有効にした場合(-xsse4.2, -xavx2, -xcoreavx512)と無効にした場合(-no-vec)について計算速度を比較せよ．
– Gnuplotによる温度分布の可視化．
gnuplot>splot “laplace.dat”>set pm3d map>replot73

(補足）ガウス・ザイデル法
l 熱伝達問題の差分式を次の反復式によって計算する．
for i=1 to i=N-1
for j=1 to j=N-1
'
(%&')
(%&')
(%)
(%&')
(%)
*
𝑇!,#
= 10Δℎ + 𝑇!+',# + 𝑇!&',# + 𝑇!,#+' + 𝑇!,#&')• 反復計算（laplace.cの43行目）の右辺をTold → Tに変更する．
• 反復計算の収束速度はi,jの走査方向に依存する．
サンプルコード laplace_gs.c74

(補足）ガウス・ザイデル法
l ヤコビ法に比べて収束が早い．
l 後方依存関係がある．
(%&')
(%&')
(%&')
𝑇!,#
← 𝑇!+',# , 𝑇!,#+'
l 依存関係がベクトル化を阻害していることが確認できる．
icc –xhost laplace_gs.c –qopt-reportl 後方依存の関係を解消する方法を考える．

75

(補足）ガウス・ザイデル法
l 前方・後方依存の解消（計算順序の組み替え）
(%&')
𝑇!,#

1
(%&')
(%)
(%&')
(%)
= 10Δℎ* + 𝑇!+',# + 𝑇!&',# + 𝑇!,#+' + 𝑇!,#&'
4• はじめに青を計算する．
(%&')

𝑇!,#

(i,j)

(%)

⟵ 𝑇!±',#±'• 次に赤を計算する．
(%&')

𝑇!’,#’(%&')⟵ 𝑇!+±',#+±'(i’,j’)

76自習問題• 前のページで解説した計算順序の入替を実装し，修正版ガウス・ザイデル法のコードを作成しなさい．

• 元の方法と修正版の方法について，収束速度，計算速度，ベクトル化の観点で比較しなさい．

77