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

背景と講義目的• 背景「富岳」のような大規模並列スーパーコンピュータによるシミュレーショ
ンを活用するためには、並列アプリケーションの開発に必要な基本的な並列計算法についての知識が必要となる。
• 講義目的
並列計算についての知識と基礎的な並列計算のプログラミング技術の習得を目的とする。
– 各種並列計算（スレッド並列、プロセス並列、アクセラレータ）について、それぞれ具体的なプログラミング法を学習する。
– 高速化のためのプログラミング技術についても学習する。
2

受講対象者
1. C言語やFortran言語などのプログラミング言語の経験があること。
2. EmacsやVim等のエディタによるファイル編集ができること。
3. Linux/Unixの基本的なコマンドを使えること。（準必須）
4. データ計算科学の研究においてスパコンおよび並列処理の知識・技術の習得が必要であること。

3

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

4

並列計算機と並列計算の種類

5並列計算機

富岳の構成• 計算機アーキテクチャ
SMP（Symmetric Multiprocessing) 共有メモリ型
Core

Core

Core

Core

Cach
e

Cach
e

Cach
e

Cach
e

MemoryA64FX CPUダイ

複数のコアが均一に並列処理

SMP Cluster 分散メモリ型

NodeMemoryMemoryMemoryMemoryInterconnetc / Network

理研HPよりMemory複数のプロセッサがネットワークを介して通信

6

並列計算機• 計算機アーキテクチャ
SMP（Symmetric Multiprocessing) 共有メモリ型
Core

Core

Core

Core

Cach
e

Cach
e

Cach
e

Cach
e

MemoryNUMA (Non-Uniform Memory Access) 共有メモリ型マルチプロセッサ計算システム
Node

MemoryMemoryMemoryMemoryInterconnetc / Network

Memory7

並列計算とは• 並列計算・・・演算を分割して、複数のプロセッサに割り当てて処理する– スレッド並列（共有メモリ型）• 分割された演算（スレッド）が、メモリ空間を共有できる。
• 複数のスレッドが均一に並列処理をする。

– プロセス並列（分散メモリ型）• 分割された演算（プロセス）が、それぞれ独立のメモリ空間を参照。
• プロセス間にデータ転送が必要。

8

並列計算の実行イメージ• スレッド並列• プロセス並列
OpenMP

マスタースレッド#pragma omp parallel{

スレッド
並列処理 1チーム

MPI

MPI_Comm_size(MPI_COMM_WORLD,&nprocs)
MPI_Comm_rank(MPI_COMM_WORLD,&myrank)/*プロセス間データ通信*/
MPI_Send(&message,count,datatype,dest,tag,comm)
MPI_Recv(&message,count,datatype,source,tag,comm)}#pragma omp parallel{

スレッド 並列処理 2
チーム}/*プロセス間データ通信*/
MPI_Send(&message,count,datatype,dest,tag,comm)
MPI_Recv(&message,count,datatype,source,tag,comm)

プロセス間通信9並列計算機と並列計算の種類
SMP

NUMA

Cluster特徴• メモリを共有• データ転送が不要• 論理的にメモリ共有• データ転送が不要• ローカルにメモリ• ノード間データ転送が必要

プログラミング• 容易
自動並列化、OpenMPが可能• 容易
自動並列化、OpenMPが
可能

• 難しい
MPIによるノード間通信が必要。

中

高い

非常に高い

スケーラビリティ（自動並列化、OpenMPはノード内でのみ可能）

10アクセラレータ• CPUの処理を一部代替して全体の処理の効率を向上させる装置
ハイブリット構成 （CPU＋アクセラレータ）
ホストCPU

コ
ア
０

コ
ア
１

コ
ア
2

ホスト側メモリ

アクセラレータコ
ア３

制御

Many coresMulti Threads

デバイスメモリ
PCIバス
11

アクセラレータの実行イメージ

12

計算機サーバと環境設定

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

計算ノード

ファイルサーバ
14

計算機サーバシステム概要
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

15

フロントエンドサーバ(rokko)へのログイン• アカウントシート：アカウント名と初期パスワード• フロントエンドサーバ IPアドレス
rokko1: 172.25.61.33
rokko2: 172.25.61.34（学籍番号が奇数の人はrokko1へ偶数の人はrokko2へ）• SSHコマンドssh␣–Y␣アカウント名@172.25.61.33（-YはX11転送を有効にするオプション。GUI操作を可能にする）⇒ログインできたらコマンド “xclock” を入力。時計が出てきたらOK。
16

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

17

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

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

3. 端末に “bash”と入力. Module環境の確認．
> module␣list

18

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

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

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

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

cd␣${PBS_O_WORKDIR}

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

echo “Hello KOBE HPC Summer”

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

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

サマースクールの期間中限定
WSキュー: 15 CPUノード

21

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

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

23

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

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

※ Linux環境構築やネットワーク設定等については補足資料を参照すること．
24

逐次プログラムの高速化

25

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

入力

演算装置

主記憶装置

CPU（中央処理装置）

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

26

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

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

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

4

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

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

0 1 3 5 61

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

27

メモリアクセス• キャッシュメモリ
CPU

CORE

命

• メインメモリ
命

令

データ

データ

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

低転送速度

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

令 データ データ 命

令

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

逐次計算の高速化
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];}29

逐次計算の高速化
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];}30

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

31

逐次計算の高速化
l 水平参照と垂直参照– 水平参照の方がキャッシュミスが少ない．
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]のデータが必要な場合，その前後のデータをまとめキャッシュにあげる．

FortranではA(i,j)は𝑗×𝐼𝑀𝐴𝑋 + 𝑖の順番になるので注意!!

32

逐次計算の高速化
キャッシュヒットキャッシュ
ミスl サブブロック分割

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
....

....

33

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

34

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

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

35

熱伝達問題の差分計算

36

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

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個の連立一次方程式を反復法で解く．
38

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

39

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

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

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

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

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

連立一次方程式の解法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 %

42

連立一次方程式の解法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 &%43

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

44

連立一次方程式の解法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と求められる。
45

連立一次方程式の解法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

46

演習４
• サンプルコード(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 &

47

（補足）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 %c1348

（補足）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 '
49

（補足）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 にゼロや小さな値が出てくる場合には、更に、行や列の入れ替えを伴う複雑な手順を考える必要がある。

50

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

!!"

−Δ𝑇 = −(!# ! + !$ !) = 10
T=0

T=0

T=0

y
x

T=0
51

• 温度場を計算する。（ラプラス方程式）−Δ𝑇 = −(

!!"
!# !

+

!!"
!$ !

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

!!"
!# !

+

!!"
!$ !

) = 10• 差分化する。

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

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

境界条件
として固定

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

サンプルコード laplace.c54

ベクトル化• 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]
55

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

56

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

（発展）ガウス・ザイデル法
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.c58

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

59

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

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

𝑇!,#

(i,j)

(%)

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

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

60

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

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

61