607 Views
November 17, 23
スライド概要
R-CCS 計算科学研究推進室
KOBE HPCサマースクール (初級)2023 講義資料 2023/09/18 兵庫県立大学 情報科学研究科 安田 修悟
背景と講義目的 • 背景 「富岳」のような大規模並列スーパーコンピュータによるシミュレーショ ンを活用するためには、並列アプリケーションの開発に必要な基本的 な並列計算法についての知識が必要となる。 • 講義目的 並列計算についての知識と基礎的な並列計算のプログラミング技術 の習得を目的とする。 – 各種並列計算(スレッド並列、プロセス並列、アクセラレータ)につい て、それぞれ具体的なプログラミング法を学習する。 – 高速化のためのプログラミング技術についても学習する。 2
受講対象者 1. 2. 3. 4. C言語やFortran言語などのプログラミング言語の経験があること。 EmacsやVim等のエディタによるファイル編集ができること。 Linux/Unixの基本的なコマンドを使えること。(準必須) データ計算科学の研究においてスパコンおよび並列処理の知識・技 術の習得が必要であること。 3
講義内容 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 計算機サーバーの環境設定と使い方 シリアルプログラムの高速化 熱伝達問題の差分計算 スレッド並列とは OpenMPによるループ処理の並列化 差分化された偏微分方程式の並列化 (招待講演:芝隼人先生) アムダール法則と並列化効率の評価 分散メモリ型並列計算機とは何か? 1対1通信関数、集団通信関数 並列計算性能の評価方法 熱伝導問題のプロセス並列計算 ハイブリッド並列 アクセラレータとは OpenACCプログラミング まとめと確認テスト (担当 兵県大・安田) (担当 R-CCS・今村先生) (担当 神大・三宅先生) (担当 兵県大・安田) 4
並列計算機と並列計算の種類 5
並列計算機 富岳の構成 • 計算機アーキテクチャ SMP(Symmetric Multiprocessing) 共有メモリ型 Core Core Core Core Cach e Cach e Cach e Cach e Memory A64FX CPUダイ 複数のコアが均一に並列処理 SMP Cluster 分散メモリ型 Node Memory Memory Memory Memory Interconnetc / Network 理研HPより Memory 複数のプロセッサがネットワークを介して通信 6
並列計算機 • 計算機アーキテクチャ SMP(Symmetric Multiprocessing) 共有メモリ型 Core Core Core Core Cach e Cach e Cach e Cach e Memory NUMA (Non-Uniform Memory Access) 共有メモリ型マルチプロセッサ計算システム Node Memory Memory Memory Memory Interconnetc / Network Memory 7
並列計算とは • 並列計算・・・演算を分割して、複数のプロセッサに 割り当てて処理する – スレッド並列(共有メモリ型) • 分割された演算(スレッド)が、メモリ空間を共有できる。 • 複数のスレッドが均一に並列処理をする。 – プロセス並列(分散メモリ型) • 分割された演算(プロセス)が、それぞれ独立のメモリ空間を参照。 • プロセス間にデータ転送が必要。 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 コ ア 0 コ ア 1 コ ア 2 ホスト側メモリ アクセラレータ コ ア 3 制御 Many cores Multi Threads デバイスメモリ PCIバス 11
アクセラレータの実行イメージ 12
計算機サーバと環境設定 13
兵庫県大・情報科学キャンパス 計算機サーバシステム概要 ログインサーバー 計算ノード ファイルサーバ 14
計算機サーバシステム概要 Host フロントエンドサーバ rokko1 rokko2 System CPU/Accelerator Memory HPE ProLiant DL380 Gen10 Intel Xeon Gold 6248 2.5GHz (20cores x2) 768GB CPUノード (Thin/Fatノード) node01~56 nodef01~08 HPE Apollo 2000 Gen10 Intel Xeon Gold 6248 2.5GHz (20cores x2) 192GB (Thin)/ 768GB (Fat) GPUノード (gpu搭載ノード) nodeg01 HPE Apollo 6500 Gen10 Intel Xeon Gold 6248 2.5GHz (20cores x2) / NVIDIA V100 32GB SXM2 x8 768GB VEノード (VE搭載ノード) nodev01~02 HPE Apollo 6500 Gen10 Intel Xeon Gold 6248 2.5GHz (20cores x2) / NEC Vector Engine Accelerator Module x8 768GB 共有メモリノード kofuji HPE ProLiant DL560 Gen10 Intel 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.sh module␣load␣intel module␣load␣gnuplot 2. “~/.bashrc”の最下部に次の1行を追記. > vim␣.bashrc .␣~/.module 3. 端末に “bash”と入力. Module環境の確認. > module␣list 18
プログラミング環境 • コンパイラ(「利用者マニュアル」30頁以降) – Intel icc␣-O3␣hello.c␣-o␣hello.out オプション 実行ファイルの指定 • 実行はPBSジョブ管理システムを使います. (「利用者マニュアル」14頁) – ジョブスクリプトの利用 qsub␣<ジョブスクリプト> – インタラクティブジョブ qsub␣-I 19
PBSジョブ管理システム • バッチスクリプトの作成 vim␣sample.sh #!/bin/bash #PBS␣-q␣T #PBS␣-I␣select=1:ncpus=1 #PBS␣-N␣sample_job #PBS␣-j␣oe /tmp/khpc2023/20230918/sample.sh ・キューの指定 ・計算リソースの指定 ・任意のジョブ名の指定 ・標準出力と標準エラー出力を統合 cd␣${PBS_O_WORKDIR} ・投入ディレクトリに移動 echo “Hello KOBE HPC Summer” ・ジョブ内で実行するコマンド • ジョブ投入 qsub␣sample.sh 20
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) 制御装置 入力 1. 2. 3. 4. 演算装置 主記憶装置 CPU(中央処理装置) 出力 主記憶装置(メモリ),1次元のアドレス空間をもつ, 命令とデータがともに記憶装置に記憶される. 演算は制御装置からの命令信号によって実行される. 命令は,プログラムカウンタにより逐次的に実行される. 26
計算機の動作原理 • チューリングマシン 1.無限に長いテープ ・・・・・・・ ・・・・・・・ 2.ヘッダ(情報の読み書き) 3.内部状態メモリ • テープの情報の読み書き. • 機械の内部状態の変更. • ヘッドの移動. • ノイマン型 メモリ 命令1 命令2 データ 命令3 番地 0 1 2 3 4 命令4 命令5 データ データ データ 5 6 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
• ヤコビ反復法 (3×3行列) 非対角成分を除いて 右辺に移行 39
• ヤコビの反復法(3×3行列) 適当な初期値を使って 反復計算を実行. 解が収束するまで反復する. (x,y,z)が収束する場合には、その値は連立一次方程式の解を与える. 40
• ヤコビの反復法 (3×3行列) – 収束判定の例 元の方程式との残差を求めて 十分小さくなるまで反復する. サンプルコード yacobi_3by3.c 41
連立一次方程式の解法2 • LU分解による解法 行列Aを下三角行列L(対角成分は1)と上三角行列Uに分解する。 (LU分解の方法は補足資料を参照.) A = LU Aが3X3行列の場合: ! a # 11 # a21 ## " a31 a12 a22 a32 a13 $ ! 1 0 & # 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 $ ! c c # 1 & # 11 12 # z2 & = # 0 c22 ## && ## z 0 " 3 % " 0 c13 $! x1 $ &# & & # c23 x2 & &# & c33 &%#" x3 &% ! 0 # 1 # b21 1 ## " b31 b32 $! 0 &# z1 0 & # z2 &# 1 &%#" z3 $ ! y $ & # 1 & & = # y2 & && ## && y % " 3 % 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 z3 = y3 − b31z1 − b21z2 (3) z1から順次,z2, z3と求められる。 45
連立一次方程式の解法2 2. ! ! U x = z を解いて、元の方程式の解 ! c c # 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
演習4 • サンプルコード(ex04_1.cとex04_2.c)を使って,次の連立一次方程式を解きなさ い. " $ $ $ $ $ $ # 5 0 1 1 1 1 2 0 −1 2 −1 1 2 1 3 0 1 0 0 1 0 0 −1 0 5 %"$ '$ '$ '$ '$ '$ '$ &# x1 % " 5 ' $ x2 ' $ 0 ' x3 ' = $ −2 $ x4 ' $ 0 ' $ 4 x5 '& # % ' ' ' ' ' ' & 47
(補足)LU分解の方法 A = LU Aが3X3行列の場合: ! a # 11 # a21 ## " a31 a12 a22 a32 a13 $ ! 1 0 & # 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 c13 b21c13 + c23 b31c13 + b32 c23 + c33 $ & & && % 48
(補足)LU分解の方法 1. 行列Aを次のようにA’に変換する。 # a a12 11 % A! = % a21 / a11 a22 − a!21a12 %% ! a12 $ a31 / a11 a32 − a31 a13 a23 − a!21a13 ! a13 a33 − a31 L, U成分での表現は? & # c c12 ( % 11 ( ⇒ % b21 c22 (( %% ' $ b31 b32 c22 c13 c23 b32 c23 + c33 & ( ( (( ' 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.c 54
ベクトル化 • 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 >replot 57
(発展)ガウス・ザイデル法 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.c 58
(発展)ガウス・ザイデル法 l ヤコビ法に比べて収束が早い. l 後方依存関係がある. (%&') (%&') (%&') 𝑇!,# ← 𝑇!+',# , 𝑇!,#+' l 依存関係がベクトル化を阻害していることが確認できる. icc –xhost laplace_gs.c –qopt-report l 後方依存の関係を解消する方法を考える. 59
(発展)ガウス・ザイデル法 l 前方・後方依存の解消(計算順序の組み替え) (%&') 𝑇!,# 1 (%&') (%) (%&') (%) = 10Δℎ* + 𝑇!+',# + 𝑇!&',# + 𝑇!,#+' + 𝑇!,#&' 4 • はじめに青を計算する. (%&') 𝑇!,# (i,j) (%) ⟵ 𝑇!±',#±' • 次に赤を計算する. (%&') 𝑇!’,#’ (%&') ⟵ 𝑇!+±',#+±' (i’,j’) 60
自習問題 • 前のページで解説した計算順序の入替を実装し,修正版ガウス・ザイ デル法のコードを作成しなさい. • 元の方法と修正版の方法について,収束速度,計算速度,ベクトル化 の観点で比較しなさい. 61