Enviar búsqueda
Cargar
短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの
•
5 recomendaciones
•
5,441 vistas
Hiroshi Watanabe
Seguir
短距離古典MDコードの設計で苦労したところ、妥協したところなど。
Leer menos
Leer más
Ingeniería
Denunciar
Compartir
Denunciar
Compartir
1 de 18
Descargar ahora
Descargar para leer sin conexión
Recomendados
短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの 〜並列編〜
短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの 〜並列編〜
Hiroshi Watanabe
短距離古典分子動力学計算の 高速化と大規模並列化
短距離古典分子動力学計算の 高速化と大規模並列化
Hiroshi Watanabe
Tuning, etc.
Tuning, etc.
Hiroshi Watanabe
AVX命令を用いたLJの力計算のSIMD化
AVX命令を用いたLJの力計算のSIMD化
Hiroshi Watanabe
CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術1
CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術1
Hiroshi Watanabe
CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術2
CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術2
Hiroshi Watanabe
いきなりAi tensor flow gpuによる画像分類と生成
いきなりAi tensor flow gpuによる画像分類と生成
Yoshi Sakai
ディープラーニングフレームワーク とChainerの実装
ディープラーニングフレームワーク とChainerの実装
Ryosuke Okuta
Recomendados
短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの 〜並列編〜
短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの 〜並列編〜
Hiroshi Watanabe
短距離古典分子動力学計算の 高速化と大規模並列化
短距離古典分子動力学計算の 高速化と大規模並列化
Hiroshi Watanabe
Tuning, etc.
Tuning, etc.
Hiroshi Watanabe
AVX命令を用いたLJの力計算のSIMD化
AVX命令を用いたLJの力計算のSIMD化
Hiroshi Watanabe
CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術1
CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術1
Hiroshi Watanabe
CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術2
CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術2
Hiroshi Watanabe
いきなりAi tensor flow gpuによる画像分類と生成
いきなりAi tensor flow gpuによる画像分類と生成
Yoshi Sakai
ディープラーニングフレームワーク とChainerの実装
ディープラーニングフレームワーク とChainerの実装
Ryosuke Okuta
LSTM (Long short-term memory) 概要
LSTM (Long short-term memory) 概要
Kenji Urai
2021 03-09-ac ri-nngen
2021 03-09-ac ri-nngen
直久 住川
Deep Learning基本理論とTensorFlow
Deep Learning基本理論とTensorFlow
Tadaichiro Nakano
Convolutionl Neural Network 入門
Convolutionl Neural Network 入門
maruyama097
再帰型ニューラルネット in 機械学習プロフェッショナルシリーズ輪読会
再帰型ニューラルネット in 機械学習プロフェッショナルシリーズ輪読会
Shotaro Sano
CMSI計算科学技術特論C (2015) OpenMX とDFT②
CMSI計算科学技術特論C (2015) OpenMX とDFT②
Computational Materials Science Initiative
Transformerを雰囲気で理解する
Transformerを雰囲気で理解する
AtsukiYamaguchi1
TensorFlowとCNTK
TensorFlowとCNTK
maruyama097
畳み込みLstm
畳み込みLstm
tak9029
Embedding Watermarks into Deep Neural Networks
Embedding Watermarks into Deep Neural Networks
Yusuke Uchida
画像処理でのPythonの利用
画像処理でのPythonの利用
Yasutomo Kawanishi
Icml読み会 deep speech2
Icml読み会 deep speech2
Jiro Nishitoba
Deep Learning技術の今
Deep Learning技術の今
Seiya Tokui
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
Norishige Fukushima
Dropout Distillation
Dropout Distillation
Shotaro Sano
Deep Learningの基礎と応用
Deep Learningの基礎と応用
Seiya Tokui
Deep Learningと画像認識 ~歴史・理論・実践~
Deep Learningと画像認識 ~歴史・理論・実践~
nlab_utokyo
ディープラーニングゼミ TensorFlowで学ぶ理論と実践
ディープラーニングゼミ TensorFlowで学ぶ理論と実践
Yota Ishida
組込み向けスクリプト言語mrubyをEV3で動かしてみよう
組込み向けスクリプト言語mrubyをEV3で動かしてみよう
Takuya Azumi
bigdata2012ml okanohara
bigdata2012ml okanohara
Preferred Networks
ハイパースレッディングの並列化への影響
ハイパースレッディングの並列化への影響
Hiroshi Watanabe
MPIによる並列計算
MPIによる並列計算
HPCシステムズ株式会社
Más contenido relacionado
La actualidad más candente
LSTM (Long short-term memory) 概要
LSTM (Long short-term memory) 概要
Kenji Urai
2021 03-09-ac ri-nngen
2021 03-09-ac ri-nngen
直久 住川
Deep Learning基本理論とTensorFlow
Deep Learning基本理論とTensorFlow
Tadaichiro Nakano
Convolutionl Neural Network 入門
Convolutionl Neural Network 入門
maruyama097
再帰型ニューラルネット in 機械学習プロフェッショナルシリーズ輪読会
再帰型ニューラルネット in 機械学習プロフェッショナルシリーズ輪読会
Shotaro Sano
CMSI計算科学技術特論C (2015) OpenMX とDFT②
CMSI計算科学技術特論C (2015) OpenMX とDFT②
Computational Materials Science Initiative
Transformerを雰囲気で理解する
Transformerを雰囲気で理解する
AtsukiYamaguchi1
TensorFlowとCNTK
TensorFlowとCNTK
maruyama097
畳み込みLstm
畳み込みLstm
tak9029
Embedding Watermarks into Deep Neural Networks
Embedding Watermarks into Deep Neural Networks
Yusuke Uchida
画像処理でのPythonの利用
画像処理でのPythonの利用
Yasutomo Kawanishi
Icml読み会 deep speech2
Icml読み会 deep speech2
Jiro Nishitoba
Deep Learning技術の今
Deep Learning技術の今
Seiya Tokui
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
Norishige Fukushima
Dropout Distillation
Dropout Distillation
Shotaro Sano
Deep Learningの基礎と応用
Deep Learningの基礎と応用
Seiya Tokui
Deep Learningと画像認識 ~歴史・理論・実践~
Deep Learningと画像認識 ~歴史・理論・実践~
nlab_utokyo
ディープラーニングゼミ TensorFlowで学ぶ理論と実践
ディープラーニングゼミ TensorFlowで学ぶ理論と実践
Yota Ishida
組込み向けスクリプト言語mrubyをEV3で動かしてみよう
組込み向けスクリプト言語mrubyをEV3で動かしてみよう
Takuya Azumi
bigdata2012ml okanohara
bigdata2012ml okanohara
Preferred Networks
La actualidad más candente
(20)
LSTM (Long short-term memory) 概要
LSTM (Long short-term memory) 概要
2021 03-09-ac ri-nngen
2021 03-09-ac ri-nngen
Deep Learning基本理論とTensorFlow
Deep Learning基本理論とTensorFlow
Convolutionl Neural Network 入門
Convolutionl Neural Network 入門
再帰型ニューラルネット in 機械学習プロフェッショナルシリーズ輪読会
再帰型ニューラルネット in 機械学習プロフェッショナルシリーズ輪読会
CMSI計算科学技術特論C (2015) OpenMX とDFT②
CMSI計算科学技術特論C (2015) OpenMX とDFT②
Transformerを雰囲気で理解する
Transformerを雰囲気で理解する
TensorFlowとCNTK
TensorFlowとCNTK
畳み込みLstm
畳み込みLstm
Embedding Watermarks into Deep Neural Networks
Embedding Watermarks into Deep Neural Networks
画像処理でのPythonの利用
画像処理でのPythonの利用
Icml読み会 deep speech2
Icml読み会 deep speech2
Deep Learning技術の今
Deep Learning技術の今
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
Dropout Distillation
Dropout Distillation
Deep Learningの基礎と応用
Deep Learningの基礎と応用
Deep Learningと画像認識 ~歴史・理論・実践~
Deep Learningと画像認識 ~歴史・理論・実践~
ディープラーニングゼミ TensorFlowで学ぶ理論と実践
ディープラーニングゼミ TensorFlowで学ぶ理論と実践
組込み向けスクリプト言語mrubyをEV3で動かしてみよう
組込み向けスクリプト言語mrubyをEV3で動かしてみよう
bigdata2012ml okanohara
bigdata2012ml okanohara
Destacado
ハイパースレッディングの並列化への影響
ハイパースレッディングの並列化への影響
Hiroshi Watanabe
MPIによる並列計算
MPIによる並列計算
HPCシステムズ株式会社
130613-debug
130613-debug
Hiroshi Watanabe
空間分割
空間分割
amusementcreators
衝突判定
衝突判定
Moto Yan
CMSI計算科学技術特論A(12) 古典分子動力学法の高速化1
CMSI計算科学技術特論A(12) 古典分子動力学法の高速化1
Computational Materials Science Initiative
Destacado
(6)
ハイパースレッディングの並列化への影響
ハイパースレッディングの並列化への影響
MPIによる並列計算
MPIによる並列計算
130613-debug
130613-debug
空間分割
空間分割
衝突判定
衝突判定
CMSI計算科学技術特論A(12) 古典分子動力学法の高速化1
CMSI計算科学技術特論A(12) 古典分子動力学法の高速化1
Similar a 短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの
Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版
Takuya Matsunaga
Dockerを支える技術
Dockerを支える技術
Etsuji Nakai
ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTURE Project
Pythonによる機械学習入門〜基礎からDeep Learningまで〜
Pythonによる機械学習入門〜基礎からDeep Learningまで〜
Yasutomo Kawanishi
CppCV03
CppCV03
Satoshi Fujimoto
大規模 Vue アプリケーションの TypeScript 移行
大規模 Vue アプリケーションの TypeScript 移行
Shingo Sasaki
NGS解析を始めた時にぶつかりがちな小さい壁あれこれ
NGS解析を始めた時にぶつかりがちな小さい壁あれこれ
DNA Data Bank of Japan center
Unityで覚えるC#
Unityで覚えるC#
Masamitsu Ishikawa
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
de:code 2017
cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携
Tomoaki Shimizu
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
Etsuji Nakai
渕田研究室全体ゼミ論文紹介 - 第1回
渕田研究室全体ゼミ論文紹介 - 第1回
MantarohYoshinaga
深層学習フレームワーク Chainer の開発と今後の展開
深層学習フレームワーク Chainer の開発と今後の展開
Seiya Tokui
完全分散エッジ処理で実現するNeutron仮想ネットワーク
完全分散エッジ処理で実現するNeutron仮想ネットワーク
Etsuji Nakai
高性能データ処理プラットフォーム (Talk on July Tech Festa 2015)
高性能データ処理プラットフォーム (Talk on July Tech Festa 2015)
Yu Liu
2012-04-25 ASPLOS2012出張報告(公開版)
2012-04-25 ASPLOS2012出張報告(公開版)
Takahiro Shinagawa
JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)
l_b__
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
Hirotaka Kawata
20170124 linux basic_1
20170124 linux basic_1
YUSUKE MORIZUMI
Boost tour 1_40_0
Boost tour 1_40_0
Akira Takahashi
Similar a 短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの
(20)
Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版
Dockerを支える技術
Dockerを支える技術
ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTUREの他のモジュール・関連プロジェクトの紹介
Pythonによる機械学習入門〜基礎からDeep Learningまで〜
Pythonによる機械学習入門〜基礎からDeep Learningまで〜
CppCV03
CppCV03
大規模 Vue アプリケーションの TypeScript 移行
大規模 Vue アプリケーションの TypeScript 移行
NGS解析を始めた時にぶつかりがちな小さい壁あれこれ
NGS解析を始めた時にぶつかりがちな小さい壁あれこれ
Unityで覚えるC#
Unityで覚えるC#
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
渕田研究室全体ゼミ論文紹介 - 第1回
渕田研究室全体ゼミ論文紹介 - 第1回
深層学習フレームワーク Chainer の開発と今後の展開
深層学習フレームワーク Chainer の開発と今後の展開
完全分散エッジ処理で実現するNeutron仮想ネットワーク
完全分散エッジ処理で実現するNeutron仮想ネットワーク
高性能データ処理プラットフォーム (Talk on July Tech Festa 2015)
高性能データ処理プラットフォーム (Talk on July Tech Festa 2015)
2012-04-25 ASPLOS2012出張報告(公開版)
2012-04-25 ASPLOS2012出張報告(公開版)
JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
20170124 linux basic_1
20170124 linux basic_1
Boost tour 1_40_0
Boost tour 1_40_0
短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの
1.
1/18 短距離ハイブリッド並列分子動力学コードの 設計思想と説明のようなもの 東大物性研 渡辺宙志 2014年7月30日
2.
2/18 概要 本資料の目的 ・並列プログラム特有の「設計の難しさ」を共有したい ・説明とソースコードを公開することで「よりよいコード」 が生まれることを期待 設計思想 ・C++で開発のしやすさと計算速度をなるべく両立
・外部ライブラリになるべく依存しない ・設計と速度がぶつかったら速度を優先 「妥協の産物」なので、速度面、設計面両方で中途半端 文句があるなら自分でもっと良いコード作って公開してください
3.
3/18 コードの概観 h-p://mdacp.sourceforge.net/ ファイルの置き場所 言語:C++ ライセンス: 修正BSD
ファイル数:50ファイル (*.ccと*.hがほぼ半数ずつ) ファイル行数: 5000 lines (ぎりぎり読める程度?) 計算の概要 ・短距離古典分子動力学法 (カットオフ付きLJポテンシャル) ・相互作用、カットオフ距離は全粒子で固定 ・MPI+OpenMPによるハイブリッド並列化 プロセス/スレッドの両方で領域分割(pseudo-‐flat-‐MPI) ・アルゴリズムの解説 Prog. Theor. Phys. 126 203-‐235 (2011) arXiv:1012.2677 Comput. Phys. Commun. 184 2775-‐2784 (2013) arXiv:1210.3450
4.
4/18 コードの動作イメージ MDManager MDUnit MDUnit MDManager MDUnit MDUnit ユーザ Project::Run Variables Variables Variables Variables MDManager: プロセスの化身。ユーザはこのインスタンスから操作する MDUnit:
スレッドの化身。計算領域を管理する。 Variables: 変数の実体を管理。MDUnitのメンバになっている。 Project: このクラスのRunメソッドが事実上のmain関数。 ProjectManager: インプットファイルから適切なProjectクラスを呼び出す Input File ProjectManager Modeを調べる 適切なプロジェクトを実行する
5.
5/18 インプットパラメータの扱い (1/2) 希望 ・なるべく汎用的に使いたい ・外部ライブラリに依存しない ・インプットファイルは手で編集する →XMLは使わない 実装 Mode=Benchmark
Density=0.5 ThermalizeLoop=150 UnitLength=50 TimeStep=0.001 TotalLoop=1000 Ini_alVelocity=0.9 インプットファイル例 ・Parameterクラス(parameter.cc/parameter.h) ・文字列ハッシュで管理する(std::map) ・名前=値の形式でずらずら並べる。 ・Parameterクラスが全て「文字列」として保存 ・値を取り出す時に文字列を解釈
6.
6/18 インプットパラメータの扱い (2/2) 1. 実行可能ファイルにインプットファイル名を渡す 2.
main関数でファイル名を受け取り、MDManagerクラスに渡す 3. MDManagerクラスが、受け取ったファイル名からParameterクラ スのインスタンスを作成 4. Parameterクラスのインスタンスを通じて値を受け取る 流れ 値の受け取り方 ハッシュキーを渡し、値を受け取る double Parameter::GetDouble(string key) ハッシュキーが定義されていなかった場合、valueを値とする (より安全) double Parameter::GetDoubleDef(string key, double value) 特殊キー「Mode」 インプットファイルは必ずModeを定義しなければならない →複数のプロジェクトの管理(後述)
7.
7/18 複数のプロジェクトの扱い(1/4) 同じ計算カーネルを、異なる研究に使いたい → 液滴衝突、界面張力測定、気液共存線・・・ ありがちなパターン こういうのは避けたい・・・
(あとはswitch文みたいなのもイヤ) int main(void){ //ProjectA(); //ProjectB(); ProjectC(); }
8.
8/18 複数のプロジェクトの扱い(2/4) ・Singletonパターンを使う ・ProjectManagerクラスをSingletonに。 ・全てのプロジェクトはProjectクラスのサブクラスに ・コンストラクタで自分をProjectManagerに登録 ・実体をグローバル変数として宣言 プロジェクトの追加→Projectクラスの実装 やりたいこと ・研究テーマごとに「プロジェクト」として管理する ・プロジェクトを追加しても、main関数を含むコードは再コンパイ ルしない ・プロジェクトは文字列で指定する 実装
9.
9/18 複数のプロジェクトの扱い(3/4) class Benchmark :
public Project { private: public: Benchmark(void) { //ここでプロジェクトマネージャクラスに自分を追加 ProjectManager::GetInstance().AddProject("Benchmark", this); }; void Run(MDManager *mdm); }; BenchmarkクラスはProjectクラスのサブクラス ベンチマークプロジェクトの例 benchmark.h benchmark.cc Benchmark bench; ←ここで実体が作られコンストラクタが呼ばれる ハッシュキー
10.
10/18 複数のプロジェクトの扱い(4/4) int main(int argc,
char **argv) { setvbuf(stdout, NULL, _IOLBF, 0); MDManager mdm(argc, argv); if (mdm.IsValid()) { ProjectManager::GetInstance().ExecuteProject(&mdm); } else { mout << "Program is aborted." << std::endl; } } main関数 (main.cc) プロジェクトマネージャがインプットファイルを読み込み、文字列ハッシュから 該当するProjectクラスのインスタンスを取得。Project::Runを実行。 void Benchmark::Run(MDManager *mdm) { //ユーザはここを記述する } 事実上のmain関数 (benchmark.cc) Mode=Benchmark Density=0.5 ThermalizeLoop=150 UnitLength=50 TimeStep=0.001 TotalLoop=1000 Ini_alVelocity=0.9 インプットファイル ハッシュキー
11.
11/18 変数の管理 (1/2) 分子動力学法で必要なデータは、運動量(p)と座標(q)。 Nを粒子数、Dを次元として以下のデータを保持。 double p[N][D];
double q[N][D]; Q. なぜstd::vectorを使わないの? A. 遅いから 世の中にはstd::vectorと生配列で死ぬほど最適化が変わるコンパイラがあるのです・・・ 同様の理由で、カットオフ長さもコンパイル時定数に mdconfig.hにて重要な定数を宣言 const int D = 3; const int N = 1000000; const int PAIRLIST_SIZE = N * 50; const double CUTOFF_LENGTH = 2.5;
12.
12/18 変数の管理 (2/2) 誰のメンバにするか? 案1:
MDUnitクラスのメンバとする 案2: Variablesクラスのメンバとして、Variablesクラスのインスタンスを MDUnitのメンバとする →案2を採用。あとで観測ルーチンを作る際、Variablesクラスのインスタ ンスを渡すのが自然だと思ったから アクセシビリティ 原則としてVariablesクラスのメンバは隠蔽したい しかし、どうしても直接いじる必要が出てくる → double q[N][D], double p[N][D]をpublicメンバに。 さらにMDUnit::GetVariablesでVariablesのインスタンスにもアクセス可能 (要するにフルオープン) Variablesクラスはほぼ構造体のような使い方に
13.
13/18 力の計算 (1/2) 力の計算はForceCalculatorクラスが担当 ただし、中身は静的メソッドのみ
(ForceCalculatorはほぼ名前空間として使用) ただ力の計算をするクラスにインスタンスを与える意義を見いだせなかったので・・・ ForceCalculatorクラスがやること ・座標の更新 (UpdatePosi_onHalf) ・運動量の更新 (CalculateForce) 力の計算は、内部でそれぞれの機種に最適化されたルーチンを呼び出す ForceCalculator::CalculateForceの中身 CalculateForceNext(vars, mesh, sinfo); //CalculateForceBruteforce(vars,sinfo); //CalculateForceSorted(vars,mesh,sinfo); //CalculateForcePair(vars,mesh,sinfo); //CalculateForceUnroll(vars,mesh,sinfo); ←Q. こういうの嫌じゃなかったんですか? A. コンパイル時に力計算ルーチンが確定して いないと、Inter-‐file op_miza_onが効かないこ とがあるんです。 設計思想はどうしてもコンパイラの仕様とぶつかる
14.
14/18 力の計算 (2/2) 座標の更新コード void ForceCalculator::UpdatePosi_onHalf(Variables
*vars, Simula_onInfo *sinfo) { const double dt2 = sinfo-‐>TimeStep * 0.5; const int pn = vars-‐>GetPar_cleNumber(); double (*q)[D] = vars-‐>q; double (*p)[D] = vars-‐>p; for (int i = 0; i < pn; i++) { q[i][X] += p[i][X] * dt2; q[i][Y] += p[i][Y] * dt2; q[i][Z] += p[i][Z] * dt2; } } というセンテンスで、以後、ローカルな二次元配列っぽく使う Variablesはクラスというより構造体として使っている Simula_onInfoクラスはシミュレーション情報を管理 (システムサイズや時間刻みなど) double (*q)[D] = vars-‐>q;
15.
15/18 標準出力の扱い 並列コードでも標準出力を使いたい しかし、適当に使うとすぐデッドロックする よくあるパターン if
(0==rank){ std::cout << Energy() << std::endl; } Energy()が内部でAllReduceしているとデッドロックする。 std::coutのラッパ、MPIStreamを作成 MPIStream mout; ←グローバル変数として宣言 mout.SetRank(rank); ← MDManagerでランク番号を教えてもらう mout << で受け取った内容をostringstreamに保存しておく std::endlを受け取った時、rank0のマスタースレッドのみ出力してクリア 関数内で通信していてもデッドロックしない mout << Energy() << std::endl; 使い方
16.
16/18 全体処理(1/2) ・MDUnit全てに対して行いたい処理がある(初期条件作成、観測、etc...) ・ユーザから見えるのはMDManagerであり、MDUnitを陽に扱いたくない ・ユーザは知っている情報をMDUnitは知らない
(系の大きさ、時間刻み等) → Executorクラス+ExecuteAllメソッド+Executeメソッド MDManagerはExecuteAllメソッドを持つ MDManager::ExecuteAllはExecutorクラスのインスタンスを 支配下のMDUnit::Executeに渡すだけ void MDManager::ExecuteAll(Executor *ex) { #pragma omp parallel for schedule(sta_c) for (int i = 0; i < num_threads; i++) { mdv[i]-‐>Execute(ex); } }
17.
17/18 全体処理(2/2) MDUnit::ExecuteはExecutorクラスのExecuteに自分を入れて呼び出すだけ void Execute(Executor *ex)
{ex-‐>Execute(this);}; mdunit.h ユーザはExecutorクラスを継承し、その中身を書く MDManager MDUnit MDUnit Executor ExecuteAll Execute Execute ユーザが定義したExecutorのインスタンスは MDManagerを通じてMDUnitに配布される MDUnitは系のサイズや時間刻み等を知らないが、Executorクラスの インスタンスを作るのはProject::Runの中なので、系のサイズなどの 情報を使える(コンストラクタで渡せる) Executor::ExecuteにはMDUnitのインスタンスが渡されるので、 それを通じてVariablesのインスタンスに好き放題できる 要するにコールバック関数
18.
18/18 まとめのようなもの 性能と拡張性・保守性の両立の難しさ ◯ プロジェクトクラスによるプロジェクト管理 ☓ 変数のアクセシビリティ、固定長配列、コメントアウトによるメソッド選択
C++を使っているのに、結局Fortranに毛が生えたようなコードに。 →これはある程度やむを得なかった。コードの抽象化は どうしてもコンパイラの最適化まわりとぶつかる。 並列化構造をなるべく隠蔽したかった。 ◯ Executorクラス+ExecuteAllである程度実装。 ☓ ちょっと複雑なことをやろうとすると、並列化構造を意識せざるを得ない。 どの情報を誰が持つべきか? ・変数はVariablesクラスに。プロセス番号などはMPIInfoクラスに、シミュレーション情 報はSimula_onInfoクラスに分けた。 → このわけかたが良いかどうか自信がない。何か指針がほしい。 ◯外部ライブラリに極力依存しない 「車輪の再開発」を行うことになるが、ライブラリ依存度が強いとスパコン環境で とてもとても苦労する。
Descargar ahora