Contenu connexe
Plus de Fixstars Corporation (20)
CuthillMckee法によるOpenFORMのDIC前処理に関するスレッド並列化
- 5. 目次
インターンの動機
CuthillMckee法を簡単な問題に適用する
– 解く問題について
– 疎行列とその取り扱い方(CSR形式)
– ヤコビ法とガウスザイデル法、並列化の壁
– Multi Coloring法
– Cuthill-Mckee法, 並列化に向けたCuthillMckee法
– 行列の変換結果 & 確認
OpenFOAMにCuthillMckee法を導入
KNLを使った計算
まとめ&今後
4
- 6. 解く問題について
0 1 2 3 4 5 6 7
8 9 10 11 12 13 14 15
16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31
32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47
48 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63
5
8x8なメッシュ上
に
-1 -1 -1
-1 8 -1
-1 -1 -1
8方向から影響
を受ける作用
を適用した結果
↑ ある与えられた分布(定数)
になるような を探す。
- 7. 解く問題について
0 1 2 3 4 5 6 7
8 9 10 11 12 13 14 15
16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31
32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47
48 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63
6
8x8なメッシュ上
に
-1 -1 -1
-1 8 -1
-1 -1 -1
8方向から影響
を受ける作用
を適用した結果
↑ ある与えられた分布(定数)
になるような を探す。
- 8. 解く問題について
8x8 のメッシュ … 長さが64の1次元ベクトル化
7
© 2017 Fixstars Corporation, All rights reserved.
0 1 2 3 4 5 6 7
8 9 10 11 12 13 14 15
16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31
32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47
48 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63
8x8なメッシュ上
↑ ある与えられた分布(定数)
(未知数)
(定数)
- 10. 解く問題について
行列で表現
– 𝑖: フィルタを番号する中心の
セル番号(座標そのものではない!)
– 𝑗:フィルタを適用される番号
9
© 2017 Fixstars Corporation, All rights reserved.
-1 -1 -1
-1 8 -1
-1 -1 -1
𝑖
(64個)
𝑗(64個)
フィルタ
0 1 2 3 4 5 6 7
8 9 10 11 12 13 14 15
16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31
32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47
48 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63
18,19, 20, 26, 28, 34, 35, 36 が -1
27が8
iは27
𝑨 =
- 13. 解く行列
青: 8
赤: -1
http://proc-cpuinfo.fixstars.com/2016/07/blog-post-html/
12
- 14. 疎行列の取り扱い方
疎行列 … 0がいっぱいあるスカスカの行列
←→ 密行列
疎行列を普通の配列で格納して計算するのはよくない。
– 疎行列にメモリをO(N^2)かけるのはよくない
疎行列を取り扱うためのデータの格納方法 → 工夫
– 普通の行列… M(i,j) にアクセス
– 工夫… [(値の位置, 値の内容), (), ()] のイメージ
CSR形式だと0とそうでない部分を区別可能!
スカスカの行列
13
- 15. 工夫例: CSR (Compressed Sparse Row)形式
右みたいな行列が与えられたとき、
Value = [a,b,c,d,e,f,g]
Column = [0,1,2,0,3,1,3]
offset = [0 ,3 ,5,6]
offsetは「abc…」
と見ていったときに行が変わるタイミング
a,d,f,gのときに行が変わるので、それに対応するindex
0,3,5,6が入っている。
14
0 1 2 3
今回はこれを使っていきます
http://www.jicfus.jp/wiki/index.php?CRS%E5%BD%A2%E5%BC%8F
- 16. CSR形式に関するライブラリ
boost::numeric::ublas::compressed_matri
x<>
に対応
15
Value = [a,b,c,d,e,f,g]
Column = [0,1,2,0,3,1,3]
offset = [0 ,3 ,5,6]
前のページの… Boostの
mat.Value_data()
mat.index2_data()
mat.index1_data()
ベクトルは
boost::numeric::ublas::vector<> を使用
疎行列・ベクトル積
boost::numeric::ublas::prod
Expression template技法を使っていて一時変数を省略しているらしい
- 21. Cuthill-Mckee法
引用 中島研吾 科学技術計算のための マルチコアプログラミング入門 C言語編 第 Ⅱ部:オーダリング
http://www.aics.riken.jp/aicssite/wp-content/uploads/2015/05/el_text_sp150305_2C_nakajima.pdf
20
- 28. 解いた問題
計算領域: (x,y,z) = (15.7m, 2m, 6.28m)
分割数: (x,y,z) = (240, 130, 96)
総メッシュ数 = 240 * 130 * 96 ≈ 3 × 106
𝑅𝑒 𝜏 = 110
主流方向 … サイクリック境界
27
x
z
y
cycliccyclic
6.28m
15.7m
2m
- 30. OpenFOAMのDIC前処理
DIC前処理の実装
– 𝑨𝒙 = 𝒃 をすばやく解くための前準備
𝒛 = 𝑰 + 𝑫−𝟏 𝑼
−𝟏
𝑰 + 𝑫−𝟏 𝑼 𝑻 −𝟏
𝑫−𝟏 𝒓
を計算する。
29
for (label i=0; i<n; i++)
{
z[i] = invD[i]*r[i];
}
// 前進代入
for (label i=0; i<n; i++)
{
for (label index = offset[i]; index < offset[i+1]; index++)
{
const auto j = column[index];
if(j < i)
{
z[i] -= invD[i] * data[index] * z[j];
}
}
}
Zが相互干渉
富岡稔、伊藤優希、丸石崇史、吉藤尚生: OpenFOAMスレッド並列化のための基礎検討(2017)
- 32. OpenMP v.s. OpenMPI
OpenMP(スレッド並列)
– CuthillMckee法を用いて、DIC前処理を並列化
– それ以外の部分は1並列
OpenMPI(プロセス並列)
– 計算領域を分割
– それぞれの領域でプロセスを割り当てて計算
– 領域間の必要なデータはプロセス間通信でやり取り
31
© 2017 Fixstars Corporation, All rights reserved.