SlideShare a Scribd company logo
1 of 51
Download to read offline
University of Tokyo
1/51	
第6回
可読性と性能の両立を目指して
渡辺宙志
東京大学物性研究所
2015年11月5日@計算科学技術特論C
University of Tokyo
2/51	
可読性と性能の両立を目指して: Agenda	
• 本講義の対象者
• 本講義の目的
• 並列分子動力学法コードMDACPについて
• プログラム設計
• クラス、継承、仮想関数	
•  モジュールの結合度	
•  インプットファイル	
•  複数プロジェクトの扱い	
• main関数の引数の扱い	
•  力の計算ルーチン
• 並列化と設計
• 通信の設計	
•  プロセス配置管理 	
•  並列構造の隠蔽
• ソースを公開するということ
University of Tokyo
3/51	
自己紹介	
小学校	
 PC-9801FでN88-BASICを触る
中学校〜高校	
 Quick BASIC + アセンブラでMS-DOSのゲームを作成
大学〜大学院 Borland C++ BuilderでWindowsのフリーソフト作成	
PerlでCGI作成
Javaでバイト
名古屋大学情報科学研究科 ActionScriptを覚えてFlashをいくつか作成
RubyでCGI作成
東京大学情報基盤センター MPIによる非自明並列計算 	
東京大学物性研究所 大規模分子動力学法で研究	
プログラム歴	
プロフィール	
自分はプログラマだと思っている(最近はSEだと思っている)
普段使う
  Ruby/C++
使ったことがある/たまに使う
 Fortran/Java/Perl/Python/JavaScript/ActionScript
University of Tokyo
4/51	
これまでに作ったもの (1/4)	
スクリプト言語の簡易実行環境 (B3)	
窓の杜 (株式会社インプレス)
University of Tokyo
5/51	
これまでに作ったもの (2/4)	
パズルゲーム (M2)	
窓の杜 (株式会社インプレス)
University of Tokyo
6/51	
これまでに作ったもの (3/4)	
量子計算シミュレータ (D1)	
http://qcad.osdn.jp/
University of Tokyo
7/51	
これまでに作ったもの (4/4)	
迷路作成ツール (名大3年目)	
窓の杜 (株式会社インプレス)
University of Tokyo
8/51	
本講義の対象者	
• 趣味ではなく、仕事でプログラムを組もうと
思っている人
•  自らプログラムを書き、そのプログラムで論
文を書く人
•  何かソフトウェアを公開しようと思っている人
University of Tokyo
9/51	
本講義の目的 (1/3)	
プログラムを組む時に最も大事なことは何か?	
妥協
University of Tokyo
10/51	
本講義の目的 (2/3)	
Done is better than perfect.
完成を目指すより、まず終わらせよ	
Code wins arguments.
コードは議論に勝る	
Facebookの新規株式公開(IPO)申請書類に添付された手紙より	
http://www.sec.gov/Archives/edgar/data/1326801/000119312512034517/d287954ds1.htm	
マーク・ザッカーバーグ(Facebookの創業者)曰く
University of Tokyo
11/51	
本講義の目的 (3/3)	
• 完成しないプログラムに価値は無い
 →どこかで妥協
• 「妥協」に正解は無い
 →どこを妥協せず、どこを妥協すべきか? 	
以上について、主に短距離分子動力学法コードMDACPの開発、
公開を通じて考えたことを紹介します。
University of Tokyo
12/51	
MDACP (1/4)	
MDACPとは?	
Molecular Dynamics code for Avogadro Challenge Project
KAUST GRP Investors 賞受賞研究
「アボガドロ数への挑戦- 非平衡現象の計算統計物理学 -」
というプロジェクトで開発
アルゴリズム	
短距離古典分子動力学法
現在はカットオフ付きLennard-Jonesポテンシャルのみ実装	
研究対象	
主に気液相転移を研究
気液転移の普遍性(平衡状態)
気泡生成待ち時間分布(準安定状態)
多重気泡生成(非平衡非定常状態)
University of Tokyo
13/51	
MDACP (2/4)	
開発の背景	
自分で書いたプログラムで論文を書きたい
世界一に挑戦してみたい
類似の並列MDコードは多数存在する
→ LAMMPS/NAMD/SPaSM/MODYLAS
ただ論文を書くだけなら上記のコードでもなんとかなる
しかも現在のMDACPよりも高機能
僕が「物理学者」なら、既存のコードを使っていたと思う
でも僕は「プログラマ」なので・・・
University of Tokyo
14/51	
MDACP (3/4)	
コード概要	
言語: C++
並列化: Ver. 1.0系 Flat-MPI
       Ver. 2.0系 MPI/OpenMPのハイブリッド並列
規模: 5000行程度 (*.ccと*.h合わせて50ファイル)
公開:オープンソース (http://mdacp.sourceforge.net/)
ライセンス: 3条項BSDライセンス	
設計思想	
• 開発のしやすさと実行速度をなるべく両立
→ ただし、速度と設計がぶつかったら速度を優先	
•  他人がアプリケーションがとして利用することは考えない
→ ソース公開の目的は「ユーザ」ではなく「開発者」に向けて	
•  なるべく外部ライブラリに依存しない
University of Tokyo
15/51	
MDACP (4/4)	
性能	
京フルノード: 82944ノード (663552コア)
ベンチマーク
 ・最大粒子数:3318億粒子 (1.77PF, 16.6%)
 ・最高性能 :12億7千万粒子 (2.44 PF, 23.0%)
プロダクトラン:
 ・13億7千万粒子 (1.81PF, 17.0%)
 ・急減圧シミュレーション
急減圧直後	
多数の泡が生成
大きな泡がより大きく
小さな泡がより小さく
最後には一つの
泡に収束
※ これらは4096ノードで計算した小さい系(2300万粒子)を可視化したもの
University of Tokyo
16/51	
MDACPのプログラム構造	
インプットファイル	
プロジェクト管理	
計算管理	
変数データ	
MD計算	
変数データ	
MD計算	
計算管理	
変数データ	
MD計算	
変数データ	
MD計算	
プロジェクト	
事前に登録された中から
適切なプロジェクトを実行	
main関数	
事実上のmain関数	
 プロセス	
通信
University of Tokyo
17/51	
プログラム設計
University of Tokyo
18/51	
クラス、継承、仮想関数 (1/2)	
クラス	
特定の機能を実現するため、データと処理(メソッド)をまとめたモジュール
継承により、子クラスを作ることができる	
継承	
既存のクラスを継承したクラスを派生クラスと呼ぶ
多くの場合、仮想関数と共に使われる
仮想関数	
継承元のクラスの動作を上書きする
仮想関数は、実際にどのメソッドが呼ばれるかが実行時まで決まらない
University of Tokyo
19/51	
クラス、継承、仮想関数 (2/2)	
Form
(コンテナ)	
Component	
Button	
Component	
TextForm	
Component	
CheckBox	
Button::Repaint	
 TextForm::Repaint	
 CheckBox::Repaint	
Component::Repaint	
Formは、Component達を管理していると思っている
再描画が必要な時、FormはComponent::Repaintを呼ぶ
実際には、派生クラスのメソッドButton::Repaint等が呼ばれる	
コンポーネントの種類が増えても、Formクラスの再コンパイルは不要
University of Tokyo
20/51	
モジュールの結合度	
結合度	
二つ以上のプログラムモジュール間の関係を表す
お互いの設計に依存関係があるほど、結合度が強い
お互いの設計が独立であるほど、結合度が弱い
モジュール間の結合が弱いコード→修正の波及が局所で収まる	
モジュール間の結合が強いコード→局所的な修正が全体に波及	
結合度が弱いほど独立性、拡張性が高い
→ 良いプログラム
・・・なのだが、実際には結合度を最低にしない設計を採用
することが多かった
University of Tokyo
21/51	
インプットファイル (1/3)	
$ ./a.out 32 1.5 	
32 # SystemSize
1.5 # Temperature 	
SystemSize=32
Tempreature=1.5	
<PARAM name=SystemSize>32</PARAM>
<PARAM name=Temperature>1.5</PARAM>
プログラムとの結合	
強い	
弱い	
実行時引数で指定	
ファイルで順番に指定	
ファイルで名前と値を指定	
XMLの利用	
これを採用
University of Tokyo
22/51	
インプットファイル (2/3)	
結合度と可読性	
XMLを採用するとlibXMLなどのライブラリの利用が必要
手で編集するのにXMLは不向き
いま与えたい情報に対してXMLはオーバースペック
→ XMLは使わない
実装	
※ 直接手でいじらないデータをXMLで保存するのは良いと思う	
• Parameterクラス(parameter.cc/h)
• 文字列ハッシュで管理 (std::map)
• 「名前=値」の形式でずらずらならべる	
• Parameterクラスは全て文字列として保存	
• 値を取り出す時に文字列を数値などに解釈
University of Tokyo
23/51	
インプットファイル (3/3)	
1. 実行可能ファイルにインプットファイル名を渡す	
2. main関数でファイル名を受け取り、計算管理クラスに渡す	
3. 計算管理クラスが、受け取ったファイル名からParameterクラ
スのインスタンスを作成	
4. Parameterクラスのインスタンスを通じて値を受け取る	
ハッシュキーを渡し、値を受け取る
double Parameter::GetDouble(string key)
ハッシュキーが定義されていなかった場合、valueを値とする (より安全)
double Parameter::GetDoubleDef(string key, double value)	
インプットファイルは必ずModeを定義しなければならない
→複数のプロジェクトの管理(後述)	
流れ	
値の受け取り	
特殊キー「Mode」
University of Tokyo
24/51	
複数のプロジェクトの扱い(1/5)	
プロダクトコードは、一つのカーネルを様々な研究に使う
(ベンチマークコードとの最大の違い)	
プログラムとの結合	
強い	
弱い	
main関数を毎回書き換えて再コンパイル	
switch文で管理する	
シングルトンパターンで管理する	
ライブラリ化する	
これを採用	
スクリプトを提供する
University of Tokyo
25/51	
複数のプロジェクトの扱い(2/5)	
switch(mode){
case PROJECTA:
ProjectA();
break;
case PROJECTB:
ProjectB();
break;
}	
int
main(void){
//ProjectA();
//ProjectB();
ProjectC();
}	
プログラムと強結合	
毎回mainを書き換える	
 switch文で管理する	
こういうのは絶対イヤ	
毎回再コンパイルが必要	
プログラムは呼ばれる可能性のある
プロジェクトを事前に知っていなけれ
ばならない
University of Tokyo
26/51	
複数のプロジェクトの扱い(3/5)	
# 2d polygon nparticle bodies
units lj
dimension 2
atom_style body nparticle 2 6
read_data data.body
velocity all create 1.44 87287 loop geom
pair_style body 5.0
pair_coeff * * 1.0 1.0
neighbor 0.3 bin
fix 1 all nve/body
fix 2 all enforce2d
#compute 1 all body/local type 1 2 3
#dump 1 all local 100 dump.body index c_1[1] c_1[2] c_1[3] c_1[4]
thermo 500
run 10000	
プログラムと弱結合	
プログラムにスクリプトを食わせる形式 (ex: LAMMPS)	
github: lammps/examples/body/in.body	
利点:  新しいプロジェクトを作っても再コンパイル不要
     → ユーザから見て使いやすい
問題点:プログラマは大変
     → 使う機能を全て事前に用意しておく必要がある 	
次元、力場、温度制御、
ループ数などを指定する
University of Tokyo
27/51	
複数のプロジェクトの扱い(4/5)	
1. ユーザはProjectクラスから派生したクラス(ProjectC)を実装
2.コンストラクタで自分をProjectManagerに登録する	
ProjectA	
“ProjectA”	
ProjectB	
“ProjectB”	
ProjectC	
“ProjectC”	
ProjectManager	
ハッシュキー	
 自分自身のポインタ	
登録	
3. ハッシュキーからProjectを探し、Runメソッドを呼ぶ	
Mode=ProjectC	
Run	
ProjectA	
“ProjectA”	
ProjectB	
“ProjectB”	
ProjectManager	
ProjectC	
“ProjectC”	
Singletonパターンによる実装
University of Tokyo
28/51	
複数のプロジェクトの扱い(5/5)	
設計思想	
プロジェクトごとにmain関数を独立に書くイメージ
プロジェクトを増やしても、本体は再コンパイル不要
実装	
ProjectManagerクラスをSingletonに	
全てのプロジェクトはProjectクラスのサブクラスに	
コンストラクタで自分をProjectManagerに登録
Project::Runの中身が事実上のmain関数
 ユーザはこの中身を書く	
長所/短所	
ライブラリに近いイメージだが、ライブラリ化はしなくてよい
新規プロジェクトの追加は、ユーザにはハードルが高い	
ユーザは僕だけだし・・・
University of Tokyo
29/51	
main関数の引数の扱い (1/4)	
main関数の引数を要求するクラスが、少なくとも2つある
• MPI_Initは引数としてargc, argvを要求
• パラメータクラス: ファイル名の取得にargvが必要
誰がどうやって受け取るべきか?	
強い	
弱い	
プログラムとの結合	
main関数の引数を要求するクラスのインスタンスを別々に作り
そのインスタンスを計算管理クラスのコンストラクタに渡す	
main関数の引数を計算管理クラスのコンストラクタに
渡してその中で全部処理してしまう	
設計変更
University of Tokyo
30/51	
main関数の引数の扱い (2/4)	
案1: argc, argvをMPI管理クラス(MPIInfo)とパラメータ管理クラス
(Parameter)それぞれのコンストラクタに渡し、それらのポインタを
管理クラスのコンストラクタに渡す。	
flat-MPI版コードではこちらを採用	
設計的にはこれがまっとうな気もする。
argc,argv	
 main	
MPIInfo	
Parameter	
argc,argv	
argc,argv	
計算管理クラス	
MPIInfo, Parameterのインスタンスを作成
管理クラスのコンストラクタに渡す
University of Tokyo
31/51	
main関数の引数の扱い (3/4)	
案2: 計算管理クラスにargc, argvを渡し、コンストラクタで
MPI_Initの処理やParameterのインスタンスを作る	
ハイブリッド版コードではこちらを採用
プログラム設計的にはあまりよろしくない
argc,argv	
 main	
MPI_Init	
Parameter	
argc,argv	
argc,argv	
計算管理クラス	
int
main(int argc, char *argv[]){
MDManager mdm(argc, argv);
}
main関数は何もしない。渡されたargc, argvをそのまま
計算管理クラスのコンストラクタにスルー
University of Tokyo
32/51	
main関数の引数の扱い (4/4)	
Q. なぜ全て計算管理クラスに詰め込んだのですか?
分けたほうが設計がきれいだと思いますが?	
A. 分けるご利益があまりないと考えたから	
その他雑多な言い訳
・MPIInfo、Parameterクラスのインスタンスは、どちらもMDManagerのメンバ
になっており、ライフタイムを共有している。MDManagerとライフタイムを共有
するクラスのインスタンスを外で作って渡す、というのがどうにも気持ち悪かった。
・プロセスの化身であるMDManagerが、自分のランクを自分で知らない、という
のが気持ち悪い気がした。「プロセスの化身」は誰か?MDManagerか?
MPIInfoか?
・main関数はなるべく簡素化したい(これは単に趣味)。
University of Tokyo
33/51	
力の計算ルーチン (1/2)	
プログラムとの結合	
強い	
弱い	
力の計算をベタに書いてしまう	
力の計算ルーチンを機種ごとに仮想関数にする	
粒子対ごとに力の計算式を仮想関数で指定	
これを採用	
• 力の計算はなるべく高速に実行したい
• アーキテクチャごとに異なる最適化が必要
• 様々な種類の相互作用に対応したい
University of Tokyo
34/51	
力の計算ルーチン (2/2)	
相互作用計算を仮想関数化	
粒子の種類によって力の計算方法を変えたい
設計としては、力の計算を仮想関数にするのが一番きれい
→ 死ぬほど遅くなる	
力の計算ルーチンを仮想関数化	
せめてアーキテクチャ毎の力の計算を仮想関数にする?
ForceCalcクラスからForceCalcforSPARC64を派生して・・・
→ やっぱり遅くなる 	
コンパイル時にどの関数が呼ばれるか決まらないと、プロシージャ間
最適化(Interprocedural optimization, IPO)が効かなくなることがあ
るため
結局 #ifdef等でベタに指定する形に・・・
University of Tokyo
35/51	
並列化と設計
University of Tokyo
36/51	
通信の設計 (1/4)	
簡単のため単純領域分割、flat-MPIのみ考える
領域更新を担当するクラスを作るのが自然
→ ここではMDUnitと名付ける	
MDUnit	
 MDUnit	
 MDUnit	
 MDUnit	
実空間	
分割された領域それぞれをMDUnitのインスタンスが管理
→ 通信まわりをどう設計すべきか?
University of Tokyo
37/51	
通信の設計 (2/4)	
案1: MDUnit同士が行う (強結合)
MDUnit	
 MDUnit	
・「隣の領域に誰がいるか」をMDUnitが自分で知っている必要がある
・「領域更新」という局所的な役割と「通信」という大局的な役割の同居
がとても気持ち悪い
→ flat-MPI版では案1を採用	
MDUnit	
 MDUnit
University of Tokyo
38/51	
通信の設計 (3/4)	
案2: MDUnitを管理するMDManagerクラスを作る
MDUnit	
 MDUnit	
 MDUnit	
 MDUnit	
MDManager	
・MDUnitは自分が全体のどこに存在するか知らない
・通信は全てMDManagerを通して行う
・局所的役割と大局的役割の分離
→ ハイブリッド版では案2を採用
University of Tokyo
39/51	
通信の設計 (4/4)	
MDManager	
通信はMDManagerを通してのみ行いたい	
MDUnit	
 MDUnit	
MDManager	
しかし実際には、ソースのどこからでもどこへでもMPI通信できる
→ MPIには本質的に「スコープ」が存在しない	
MDUnitに隣接する領域のランクを教えないことで
擬似的に「スコープ」を導入したつもりだが・・・	
MPI通信とスコープ
University of Tokyo
40/51	
プロセス配置管理 (1/2)	
MPIでは、ノードをまたぐ通信量をなるべく減らすように
プロセスを配置する
0	
 1 4	
 5
2	
 3 6	
 7
8	
 9 11	
 12	
10	
 11	
 13	
14	
ハイブリッドだとさらにややこしくなる。
→ どの領域に誰がいるかの「地図」の管理が必要	
1ノード4プロセス、4ノード計算のプロセス配置例
University of Tokyo
41/51	
プロセス配置管理 (2/2)	
案1: MPIInfoクラスを作って、そこで地図を管理 (疎結合)
通信するクラスがMPIInfoクラスのインスタンスを持つ	
案2: MDManagerクラスが地図を直接管理してしまう (強結合)	
flat-MPIコードの開発では案1を採用したが、
ハイブリッドコードの開発では案2を採用
ハイブリッドコードでは、MDManagerのコンストラクタ、デストラクタで
MPI_Init/Finalizeを呼び出すなど、MPIに関する情報を分離していない
Flat-MPI版ではなるべく分離したが、分離するメリットがあまり感じられな
かったため
University of Tokyo
42/51	
並列構造の隠蔽 (1/3)	
全体処理の扱い	
領域分割による並列化により、変数データが分散している
初期化や観測ルーチンなどの全体処理をどう書くべきか?	
設計思想	
ユーザから見えるのは計算管理クラス(MDManager)のみ
計算クラス(MDUnit)が管理するデータを触りたい
なるべく並列化構造を意識したくない	
ユーザ	
計算管理クラス	
MDUnit	
MDUnit	
処理を依頼	
ここでそれぞれの領域で処理
結果を返す	
MDUnit	
MDUnit	
計算管理クラス	
適宜通信
University of Tokyo
43/51	
並列構造の隠蔽 (2/3)	
MDManagerはExecuteAllメソッドを持つ
MDManager::ExecuteAllはExecutorクラスのインスタンスを
支配下のMDUnit::Executeに渡すだけ	
void
MDManager::ExecuteAll(Executor *ex) {
#pragma omp parallel for schedule(static)
for (int i = 0; i < num_threads; i++) {
mdv[i]->Execute(ex);
}
}
実装	
ユーザはExecutorクラスを派生したクラスを作り、
その中のExecuteメソッドをオーバーライドする
University of Tokyo
44/51	
並列構造の隠蔽 (3/3)	
MDManager	
MDUnit	
MDUnit	
Executor	
ExecuteAll	
 Executor::
Execute	
Execute	
• ユーザが定義したExecutorのインスタンスはMDManagerを通
じてMDUnitに配布される
• Executor::ExecuteにはMDUnitのインスタンスが渡されるので、
それを通じて好き放題できる
• MDUnitは系のサイズや時間刻み等を知らないが、Executorク
ラスのインスタンスを作るのはProject::Runの中なので、系のサ
イズなどの情報を使える(コンストラクタで渡せる)	
要するにコールバック関数	
Project::Run	
形の上では並列構造は隠蔽できたが、結局並列構造を
理解していないと中身を組めない・・・
University of Tokyo
45/51	
ソースを公開するということ
University of Tokyo
46/51	
ソースを公開するということ (1/5)	
ソースを公開して良いことはあるだろうか?	
あまりフィードバックの価値のない文句は言われる	
バグ報告などはほとんど無い
→ 公開してもあまりいいことはない
では、なぜそれでもソースを公開するのか	
そもそもデファクトスタンダードを目指していない
ユーザを増やそうともしていない
University of Tokyo
47/51	
ソースを公開するということ (2/5)	
原題:SHOWSTOPPER	
「伝説のプログラマー」D. カトラーが
Windows NTを作るお話
University of Tokyo
48/51	
ソースを公開するということ (3/5)	
Windows 9x系	
 Windows NT系	
Windows 95	
Windows 98	
Windows 98SE	
Windows ME	
Windows NT 3.1	
Windows NT 3.5	
Windows NT 3.51	
Windows NT 4.0	
Windows 2000	
Windows XP	
家庭用	
 業務用	
統合	
9x系とNT系は全く異なるOS
その統合期には多くの混乱があった
University of Tokyo
49/51	
ソースを公開するということ (4/5)	
Windows プログラミング	
WindowsにおけるプログラミングはAPIと呼ばれるものを使う
9x系からNT系へ	
当時Windows 98で開発していたソフトが、Windows 2000で動
作しないという報告を受け取る
実機が無いためどうにもならなかったが、同様な機能を持つソフト
がソースを公開しており、それを参考に修正→動作するように	
異なるOSでも、同じAPIを使えば同じ動作が保証される・・・はず	
API (Application Programming Interface)
OSが提供する機能(ファイルアクセスやマウスイベント取得)の利用
それまでソースは公開していなかったが、この一件以来
公開するように
University of Tokyo
50/51	
ソースを公開するということ (5/5)	
ソースは公開すべきだろうか?	
メリット/デメリットで言えば、個人的には公開する意味は薄いと思う	
しかし我々は、インターネットの海に浮かぶ様々な栄養を日常的に
摂取している。であれば、自らも何かフィードバックすべきでは?
MDACPのソースを公開する理由	
• 短距離MDのデファクトスタンダードを目指しているわけではない
• 多くのユーザを獲得するためでもない
• バグ報告などを期待しているわけでもない
「京」フルノードで動作が確認されたリファレンス実装として、これか
ら並列コードを組む人が参考にするための資料として公開
University of Tokyo
51/51	
まとめ	
・設計に正解はない
 ・特に性能と拡張性・保守性の両立は難しい
 ・とりあえず書いてみる (考えるより組む方が早い)
 ・ただし、設計が良くないと思ったら書き直すこと
・並列プログラムは面倒くさい
 ・並列化構造を隠蔽しようと試みた
 ・複雑なことをやろうとすると、並列化構造の理解必須
・ソースの公開について
 ・無理にやらなくても良いと思う
 ・文句を言うより、どうせなら言われる側になろう

More Related Content

What's hot

2015 summercamp 04
2015 summercamp 042015 summercamp 04
2015 summercamp 04openrtm
 
2010 icse-an analysis of the variability in forty preprocessor-based software...
2010 icse-an analysis of the variability in forty preprocessor-based software...2010 icse-an analysis of the variability in forty preprocessor-based software...
2010 icse-an analysis of the variability in forty preprocessor-based software...n-yuki
 
ポケモンの画像分類(みんなのPython勉強会#73 ライトニングトーク)
ポケモンの画像分類(みんなのPython勉強会#73 ライトニングトーク)ポケモンの画像分類(みんなのPython勉強会#73 ライトニングトーク)
ポケモンの画像分類(みんなのPython勉強会#73 ライトニングトーク)Naoya Takeuchi
 
Portable RT-Middleware environment on a USB memory for the robot programing ...
Portable RT-Middleware environment on a USB memory  for the robot programing ...Portable RT-Middleware environment on a USB memory  for the robot programing ...
Portable RT-Middleware environment on a USB memory for the robot programing ...s15mh218
 
2015 summercamp 01
2015 summercamp 012015 summercamp 01
2015 summercamp 01openrtm
 
自動アングル機能を有したロボットカメラSi
自動アングル機能を有したロボットカメラSi自動アングル機能を有したロボットカメラSi
自動アングル機能を有したロボットカメラSiShogo Namatame
 
ソフトウェアエンジニアリングの全体とIoT時代のモデリングおよび関連する品質
ソフトウェアエンジニアリングの全体とIoT時代のモデリングおよび関連する品質ソフトウェアエンジニアリングの全体とIoT時代のモデリングおよび関連する品質
ソフトウェアエンジニアリングの全体とIoT時代のモデリングおよび関連する品質Hironori Washizaki
 
CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術1
CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術1CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術1
CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術1Computational Materials Science Initiative
 

What's hot (8)

2015 summercamp 04
2015 summercamp 042015 summercamp 04
2015 summercamp 04
 
2010 icse-an analysis of the variability in forty preprocessor-based software...
2010 icse-an analysis of the variability in forty preprocessor-based software...2010 icse-an analysis of the variability in forty preprocessor-based software...
2010 icse-an analysis of the variability in forty preprocessor-based software...
 
ポケモンの画像分類(みんなのPython勉強会#73 ライトニングトーク)
ポケモンの画像分類(みんなのPython勉強会#73 ライトニングトーク)ポケモンの画像分類(みんなのPython勉強会#73 ライトニングトーク)
ポケモンの画像分類(みんなのPython勉強会#73 ライトニングトーク)
 
Portable RT-Middleware environment on a USB memory for the robot programing ...
Portable RT-Middleware environment on a USB memory  for the robot programing ...Portable RT-Middleware environment on a USB memory  for the robot programing ...
Portable RT-Middleware environment on a USB memory for the robot programing ...
 
2015 summercamp 01
2015 summercamp 012015 summercamp 01
2015 summercamp 01
 
自動アングル機能を有したロボットカメラSi
自動アングル機能を有したロボットカメラSi自動アングル機能を有したロボットカメラSi
自動アングル機能を有したロボットカメラSi
 
ソフトウェアエンジニアリングの全体とIoT時代のモデリングおよび関連する品質
ソフトウェアエンジニアリングの全体とIoT時代のモデリングおよび関連する品質ソフトウェアエンジニアリングの全体とIoT時代のモデリングおよび関連する品質
ソフトウェアエンジニアリングの全体とIoT時代のモデリングおよび関連する品質
 
CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術1
CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術1CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術1
CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術1
 

Viewers also liked

インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編Yoshitaka Kimisaki
 
Version Control System Tutorial バージョン管理システムチュートリアル
Version Control System Tutorial バージョン管理システムチュートリアルVersion Control System Tutorial バージョン管理システムチュートリアル
Version Control System Tutorial バージョン管理システムチュートリアルComputational Materials Science Initiative
 
2012 International CES Trend Guide & Report
2012 International CES Trend Guide & Report2012 International CES Trend Guide & Report
2012 International CES Trend Guide & ReportAndy Hunter
 
ReebootWhatIsAnalyticsVideo9.25.08 Slideshare
ReebootWhatIsAnalyticsVideo9.25.08 SlideshareReebootWhatIsAnalyticsVideo9.25.08 Slideshare
ReebootWhatIsAnalyticsVideo9.25.08 SlideshareAndy Hunter
 
University-Industry Research Relationships(UIRRs) and Game AI
University-Industry Research Relationships(UIRRs) and Game AIUniversity-Industry Research Relationships(UIRRs) and Game AI
University-Industry Research Relationships(UIRRs) and Game AIsyamane
 
Library Services Related to eBooks at 3 Research Universities in Japan
Library Services Related to eBooks at 3 Research Universities in JapanLibrary Services Related to eBooks at 3 Research Universities in Japan
Library Services Related to eBooks at 3 Research Universities in JapanUi Ikeuchi
 
Digital Immersion: What's Next for Social Media Marketing
Digital Immersion: What's Next for Social Media MarketingDigital Immersion: What's Next for Social Media Marketing
Digital Immersion: What's Next for Social Media MarketingAndy Hunter
 
開発ゼミ発表
開発ゼミ発表開発ゼミ発表
開発ゼミ発表YanoLabLT
 
Unity2015_No5_~Mecanim~
 Unity2015_No5_~Mecanim~  Unity2015_No5_~Mecanim~
Unity2015_No5_~Mecanim~ CHY72
 
HokurikuUnConference: Windows7
HokurikuUnConference: Windows7HokurikuUnConference: Windows7
HokurikuUnConference: Windows7guest3820592
 
とあるFlashの自動生成
とあるFlashの自動生成とあるFlashの自動生成
とあるFlashの自動生成Akineko Shimizu
 
FOSS4G LT - Invitation to ActionScript Programming
FOSS4G LT - Invitation to ActionScript ProgrammingFOSS4G LT - Invitation to ActionScript Programming
FOSS4G LT - Invitation to ActionScript Programminggyuque
 
WCAN mini Actionscript Vol.9 - LEDガジェット、ただのピカピカと見るか?アニメーションと見るか?
WCAN mini Actionscript Vol.9 - LEDガジェット、ただのピカピカと見るか?アニメーションと見るか?WCAN mini Actionscript Vol.9 - LEDガジェット、ただのピカピカと見るか?アニメーションと見るか?
WCAN mini Actionscript Vol.9 - LEDガジェット、ただのピカピカと見るか?アニメーションと見るか?Hideyuki TAKEI
 
2011/12/14 FxUG発表資料 初めてのRobotlegs
2011/12/14 FxUG発表資料 初めてのRobotlegs 2011/12/14 FxUG発表資料 初めてのRobotlegs
2011/12/14 FxUG発表資料 初めてのRobotlegs 豊 満石
 
Groovyクイズ(計算編)
Groovyクイズ(計算編)Groovyクイズ(計算編)
Groovyクイズ(計算編)Yasuharu Hayami
 
JavaScript Tips 2015(PDF 版)
JavaScript Tips 2015(PDF 版)JavaScript Tips 2015(PDF 版)
JavaScript Tips 2015(PDF 版)taskie
 
Unity講座資料1
Unity講座資料1Unity講座資料1
Unity講座資料1Mattun
 
Unity講座資料 共通
Unity講座資料 共通Unity講座資料 共通
Unity講座資料 共通Mattun
 

Viewers also liked (20)

インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編
 
Version Control System Tutorial バージョン管理システムチュートリアル
Version Control System Tutorial バージョン管理システムチュートリアルVersion Control System Tutorial バージョン管理システムチュートリアル
Version Control System Tutorial バージョン管理システムチュートリアル
 
2012 International CES Trend Guide & Report
2012 International CES Trend Guide & Report2012 International CES Trend Guide & Report
2012 International CES Trend Guide & Report
 
ReebootWhatIsAnalyticsVideo9.25.08 Slideshare
ReebootWhatIsAnalyticsVideo9.25.08 SlideshareReebootWhatIsAnalyticsVideo9.25.08 Slideshare
ReebootWhatIsAnalyticsVideo9.25.08 Slideshare
 
University-Industry Research Relationships(UIRRs) and Game AI
University-Industry Research Relationships(UIRRs) and Game AIUniversity-Industry Research Relationships(UIRRs) and Game AI
University-Industry Research Relationships(UIRRs) and Game AI
 
Library Services Related to eBooks at 3 Research Universities in Japan
Library Services Related to eBooks at 3 Research Universities in JapanLibrary Services Related to eBooks at 3 Research Universities in Japan
Library Services Related to eBooks at 3 Research Universities in Japan
 
Digital Immersion: What's Next for Social Media Marketing
Digital Immersion: What's Next for Social Media MarketingDigital Immersion: What's Next for Social Media Marketing
Digital Immersion: What's Next for Social Media Marketing
 
開発ゼミ発表
開発ゼミ発表開発ゼミ発表
開発ゼミ発表
 
Unity2015_No5_~Mecanim~
 Unity2015_No5_~Mecanim~  Unity2015_No5_~Mecanim~
Unity2015_No5_~Mecanim~
 
Scc2015 you tube
Scc2015 you tubeScc2015 you tube
Scc2015 you tube
 
HokurikuUnConference: Windows7
HokurikuUnConference: Windows7HokurikuUnConference: Windows7
HokurikuUnConference: Windows7
 
とあるFlashの自動生成
とあるFlashの自動生成とあるFlashの自動生成
とあるFlashの自動生成
 
FOSS4G LT - Invitation to ActionScript Programming
FOSS4G LT - Invitation to ActionScript ProgrammingFOSS4G LT - Invitation to ActionScript Programming
FOSS4G LT - Invitation to ActionScript Programming
 
WCAN mini Actionscript Vol.9 - LEDガジェット、ただのピカピカと見るか?アニメーションと見るか?
WCAN mini Actionscript Vol.9 - LEDガジェット、ただのピカピカと見るか?アニメーションと見るか?WCAN mini Actionscript Vol.9 - LEDガジェット、ただのピカピカと見るか?アニメーションと見るか?
WCAN mini Actionscript Vol.9 - LEDガジェット、ただのピカピカと見るか?アニメーションと見るか?
 
2011/12/14 FxUG発表資料 初めてのRobotlegs
2011/12/14 FxUG発表資料 初めてのRobotlegs 2011/12/14 FxUG発表資料 初めてのRobotlegs
2011/12/14 FxUG発表資料 初めてのRobotlegs
 
Groovyクイズ(計算編)
Groovyクイズ(計算編)Groovyクイズ(計算編)
Groovyクイズ(計算編)
 
JavaScript Tips 2015(PDF 版)
JavaScript Tips 2015(PDF 版)JavaScript Tips 2015(PDF 版)
JavaScript Tips 2015(PDF 版)
 
Scc2015 SNS Tech
Scc2015 SNS TechScc2015 SNS Tech
Scc2015 SNS Tech
 
Unity講座資料1
Unity講座資料1Unity講座資料1
Unity講座資料1
 
Unity講座資料 共通
Unity講座資料 共通Unity講座資料 共通
Unity講座資料 共通
 

Similar to CMSI計算科学技術特論C (2015) 可読性と性能の両立を目指して

Howtoよいデザイン
HowtoよいデザインHowtoよいデザイン
HowtoよいデザインHiroki Yagita
 
[DDBJing31] 軽量仮想環境を用いてNGSデータの解析再現性を担保する
[DDBJing31] 軽量仮想環境を用いてNGSデータの解析再現性を担保する[DDBJing31] 軽量仮想環境を用いてNGSデータの解析再現性を担保する
[DDBJing31] 軽量仮想環境を用いてNGSデータの解析再現性を担保するDNA Data Bank of Japan center
 
Mk network programmability-03
Mk network programmability-03Mk network programmability-03
Mk network programmability-03Miya Kohno
 
MLflowで学ぶMLOpsことはじめ
MLflowで学ぶMLOpsことはじめMLflowで学ぶMLOpsことはじめ
MLflowで学ぶMLOpsことはじめKenichi Sonoda
 
「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態npsg
 
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】Tomoharu ASAMI
 
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】Tomoharu ASAMI
 
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説Daisuke Nishino
 
Awamoto master thesis
Awamoto master thesisAwamoto master thesis
Awamoto master thesispflab
 
Development and Experiment of Deep Learning with Caffe and maf
Development and Experiment of Deep Learning with Caffe and mafDevelopment and Experiment of Deep Learning with Caffe and maf
Development and Experiment of Deep Learning with Caffe and mafKenta Oono
 
Eclipse xtext 紹介
Eclipse xtext 紹介Eclipse xtext 紹介
Eclipse xtext 紹介Akira Tanaka
 
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】Tomoharu ASAMI
 
最先端NLP勉強会2017_ACL17
最先端NLP勉強会2017_ACL17最先端NLP勉強会2017_ACL17
最先端NLP勉強会2017_ACL17Masayoshi Kondo
 
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶShumpei Shiraishi
 
.NET micro FrameWork for TOPPERS (.NET基礎)@基礎勉強会
.NET micro  FrameWork for TOPPERS  (.NET基礎)@基礎勉強会.NET micro  FrameWork for TOPPERS  (.NET基礎)@基礎勉強会
.NET micro FrameWork for TOPPERS (.NET基礎)@基礎勉強会Kiyoshi Ogawa
 
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】Tomoharu ASAMI
 
電子教科書の技術動向とEDUPUB
電子教科書の技術動向とEDUPUB電子教科書の技術動向とEDUPUB
電子教科書の技術動向とEDUPUBYasuhisa Tamura
 
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】Tomoharu ASAMI
 

Similar to CMSI計算科学技術特論C (2015) 可読性と性能の両立を目指して (20)

Howtoよいデザイン
HowtoよいデザインHowtoよいデザイン
Howtoよいデザイン
 
[DDBJing31] 軽量仮想環境を用いてNGSデータの解析再現性を担保する
[DDBJing31] 軽量仮想環境を用いてNGSデータの解析再現性を担保する[DDBJing31] 軽量仮想環境を用いてNGSデータの解析再現性を担保する
[DDBJing31] 軽量仮想環境を用いてNGSデータの解析再現性を担保する
 
Mk network programmability-03
Mk network programmability-03Mk network programmability-03
Mk network programmability-03
 
MLflowで学ぶMLOpsことはじめ
MLflowで学ぶMLOpsことはじめMLflowで学ぶMLOpsことはじめ
MLflowで学ぶMLOpsことはじめ
 
「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態
 
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
 
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
 
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
 
Awamoto master thesis
Awamoto master thesisAwamoto master thesis
Awamoto master thesis
 
Development and Experiment of Deep Learning with Caffe and maf
Development and Experiment of Deep Learning with Caffe and mafDevelopment and Experiment of Deep Learning with Caffe and maf
Development and Experiment of Deep Learning with Caffe and maf
 
Eclipse xtext 紹介
Eclipse xtext 紹介Eclipse xtext 紹介
Eclipse xtext 紹介
 
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
 
最先端NLP勉強会2017_ACL17
最先端NLP勉強会2017_ACL17最先端NLP勉強会2017_ACL17
最先端NLP勉強会2017_ACL17
 
Coderetreat
CoderetreatCoderetreat
Coderetreat
 
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
 
.NET micro FrameWork for TOPPERS (.NET基礎)@基礎勉強会
.NET micro  FrameWork for TOPPERS  (.NET基礎)@基礎勉強会.NET micro  FrameWork for TOPPERS  (.NET基礎)@基礎勉強会
.NET micro FrameWork for TOPPERS (.NET基礎)@基礎勉強会
 
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
 
私とOSSの25年
私とOSSの25年私とOSSの25年
私とOSSの25年
 
電子教科書の技術動向とEDUPUB
電子教科書の技術動向とEDUPUB電子教科書の技術動向とEDUPUB
電子教科書の技術動向とEDUPUB
 
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
 

More from Computational Materials Science Initiative

More from Computational Materials Science Initiative (20)

MateriApps LIVE! の設定
MateriApps LIVE! の設定MateriApps LIVE! の設定
MateriApps LIVE! の設定
 
How to setup MateriApps LIVE!
How to setup MateriApps LIVE!How to setup MateriApps LIVE!
How to setup MateriApps LIVE!
 
How to setup MateriApps LIVE!
How to setup MateriApps LIVE!How to setup MateriApps LIVE!
How to setup MateriApps LIVE!
 
MateriApps LIVE!の設定
MateriApps LIVE!の設定MateriApps LIVE!の設定
MateriApps LIVE!の設定
 
MateriApps LIVE! の設定
MateriApps LIVE! の設定MateriApps LIVE! の設定
MateriApps LIVE! の設定
 
How to setup MateriApps LIVE!
How to setup MateriApps LIVE!How to setup MateriApps LIVE!
How to setup MateriApps LIVE!
 
How to setup MateriApps LIVE!
How to setup MateriApps LIVE!How to setup MateriApps LIVE!
How to setup MateriApps LIVE!
 
MateriApps LIVE! の設定
MateriApps LIVE! の設定MateriApps LIVE! の設定
MateriApps LIVE! の設定
 
MateriApps LIVE! の設定
MateriApps LIVE! の設定MateriApps LIVE! の設定
MateriApps LIVE! の設定
 
How to setup MateriApps LIVE!
How to setup MateriApps LIVE!How to setup MateriApps LIVE!
How to setup MateriApps LIVE!
 
How to setup MateriApps LIVE!
How to setup MateriApps LIVE!How to setup MateriApps LIVE!
How to setup MateriApps LIVE!
 
MateriApps LIVE! の設定
MateriApps LIVE! の設定MateriApps LIVE! の設定
MateriApps LIVE! の設定
 
How to setup MateriApps LIVE!
How to setup MateriApps LIVE!How to setup MateriApps LIVE!
How to setup MateriApps LIVE!
 
MateriApps LIVE!の設定
MateriApps LIVE!の設定MateriApps LIVE!の設定
MateriApps LIVE!の設定
 
ALPSチュートリアル
ALPSチュートリアルALPSチュートリアル
ALPSチュートリアル
 
How to setup MateriApps LIVE!
How to setup MateriApps LIVE!How to setup MateriApps LIVE!
How to setup MateriApps LIVE!
 
MateriApps LIVE!の設定
MateriApps LIVE!の設定MateriApps LIVE!の設定
MateriApps LIVE!の設定
 
MateriApps: OpenMXを利用した第一原理計算の簡単な実習
MateriApps: OpenMXを利用した第一原理計算の簡単な実習MateriApps: OpenMXを利用した第一原理計算の簡単な実習
MateriApps: OpenMXを利用した第一原理計算の簡単な実習
 
CMSI計算科学技術特論C (2015) ALPS と量子多体問題②
CMSI計算科学技術特論C (2015) ALPS と量子多体問題②CMSI計算科学技術特論C (2015) ALPS と量子多体問題②
CMSI計算科学技術特論C (2015) ALPS と量子多体問題②
 
CMSI計算科学技術特論C (2015) ALPS と量子多体問題①
CMSI計算科学技術特論C (2015) ALPS と量子多体問題①CMSI計算科学技術特論C (2015) ALPS と量子多体問題①
CMSI計算科学技術特論C (2015) ALPS と量子多体問題①
 

Recently uploaded

世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラムKochi Eng Camp
 
The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024koheioishi1
 
TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationYukiTerazawa
 
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ssusere0a682
 
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料Tokyo Institute of Technology
 
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料Takayuki Itoh
 
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~Kochi Eng Camp
 
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2Tokyo Institute of Technology
 

Recently uploaded (8)

世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
 
The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024
 
TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentation
 
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
 
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
 
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
 
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
 
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
 

CMSI計算科学技術特論C (2015) 可読性と性能の両立を目指して

  • 2. University of Tokyo 2/51 可読性と性能の両立を目指して: Agenda • 本講義の対象者 • 本講義の目的 • 並列分子動力学法コードMDACPについて • プログラム設計 • クラス、継承、仮想関数 •  モジュールの結合度 •  インプットファイル •  複数プロジェクトの扱い • main関数の引数の扱い •  力の計算ルーチン • 並列化と設計 • 通信の設計 •  プロセス配置管理 •  並列構造の隠蔽 • ソースを公開するということ
  • 3. University of Tokyo 3/51 自己紹介 小学校 PC-9801FでN88-BASICを触る 中学校〜高校 Quick BASIC + アセンブラでMS-DOSのゲームを作成 大学〜大学院 Borland C++ BuilderでWindowsのフリーソフト作成 PerlでCGI作成 Javaでバイト 名古屋大学情報科学研究科 ActionScriptを覚えてFlashをいくつか作成 RubyでCGI作成 東京大学情報基盤センター MPIによる非自明並列計算 東京大学物性研究所 大規模分子動力学法で研究 プログラム歴 プロフィール 自分はプログラマだと思っている(最近はSEだと思っている) 普段使う   Ruby/C++ 使ったことがある/たまに使う  Fortran/Java/Perl/Python/JavaScript/ActionScript
  • 4. University of Tokyo 4/51 これまでに作ったもの (1/4) スクリプト言語の簡易実行環境 (B3) 窓の杜 (株式会社インプレス)
  • 5. University of Tokyo 5/51 これまでに作ったもの (2/4) パズルゲーム (M2) 窓の杜 (株式会社インプレス)
  • 6. University of Tokyo 6/51 これまでに作ったもの (3/4) 量子計算シミュレータ (D1) http://qcad.osdn.jp/
  • 7. University of Tokyo 7/51 これまでに作ったもの (4/4) 迷路作成ツール (名大3年目) 窓の杜 (株式会社インプレス)
  • 8. University of Tokyo 8/51 本講義の対象者 • 趣味ではなく、仕事でプログラムを組もうと 思っている人 •  自らプログラムを書き、そのプログラムで論 文を書く人 •  何かソフトウェアを公開しようと思っている人
  • 9. University of Tokyo 9/51 本講義の目的 (1/3) プログラムを組む時に最も大事なことは何か? 妥協
  • 10. University of Tokyo 10/51 本講義の目的 (2/3) Done is better than perfect. 完成を目指すより、まず終わらせよ Code wins arguments. コードは議論に勝る Facebookの新規株式公開(IPO)申請書類に添付された手紙より http://www.sec.gov/Archives/edgar/data/1326801/000119312512034517/d287954ds1.htm マーク・ザッカーバーグ(Facebookの創業者)曰く
  • 11. University of Tokyo 11/51 本講義の目的 (3/3) • 完成しないプログラムに価値は無い  →どこかで妥協 • 「妥協」に正解は無い  →どこを妥協せず、どこを妥協すべきか? 以上について、主に短距離分子動力学法コードMDACPの開発、 公開を通じて考えたことを紹介します。
  • 12. University of Tokyo 12/51 MDACP (1/4) MDACPとは? Molecular Dynamics code for Avogadro Challenge Project KAUST GRP Investors 賞受賞研究 「アボガドロ数への挑戦- 非平衡現象の計算統計物理学 -」 というプロジェクトで開発 アルゴリズム 短距離古典分子動力学法 現在はカットオフ付きLennard-Jonesポテンシャルのみ実装 研究対象 主に気液相転移を研究 気液転移の普遍性(平衡状態) 気泡生成待ち時間分布(準安定状態) 多重気泡生成(非平衡非定常状態)
  • 13. University of Tokyo 13/51 MDACP (2/4) 開発の背景 自分で書いたプログラムで論文を書きたい 世界一に挑戦してみたい 類似の並列MDコードは多数存在する → LAMMPS/NAMD/SPaSM/MODYLAS ただ論文を書くだけなら上記のコードでもなんとかなる しかも現在のMDACPよりも高機能 僕が「物理学者」なら、既存のコードを使っていたと思う でも僕は「プログラマ」なので・・・
  • 14. University of Tokyo 14/51 MDACP (3/4) コード概要 言語: C++ 並列化: Ver. 1.0系 Flat-MPI        Ver. 2.0系 MPI/OpenMPのハイブリッド並列 規模: 5000行程度 (*.ccと*.h合わせて50ファイル) 公開:オープンソース (http://mdacp.sourceforge.net/) ライセンス: 3条項BSDライセンス 設計思想 • 開発のしやすさと実行速度をなるべく両立 → ただし、速度と設計がぶつかったら速度を優先 •  他人がアプリケーションがとして利用することは考えない → ソース公開の目的は「ユーザ」ではなく「開発者」に向けて •  なるべく外部ライブラリに依存しない
  • 15. University of Tokyo 15/51 MDACP (4/4) 性能 京フルノード: 82944ノード (663552コア) ベンチマーク  ・最大粒子数:3318億粒子 (1.77PF, 16.6%)  ・最高性能 :12億7千万粒子 (2.44 PF, 23.0%) プロダクトラン:  ・13億7千万粒子 (1.81PF, 17.0%)  ・急減圧シミュレーション 急減圧直後 多数の泡が生成 大きな泡がより大きく 小さな泡がより小さく 最後には一つの 泡に収束 ※ これらは4096ノードで計算した小さい系(2300万粒子)を可視化したもの
  • 18. University of Tokyo 18/51 クラス、継承、仮想関数 (1/2) クラス 特定の機能を実現するため、データと処理(メソッド)をまとめたモジュール 継承により、子クラスを作ることができる 継承 既存のクラスを継承したクラスを派生クラスと呼ぶ 多くの場合、仮想関数と共に使われる 仮想関数 継承元のクラスの動作を上書きする 仮想関数は、実際にどのメソッドが呼ばれるかが実行時まで決まらない
  • 19. University of Tokyo 19/51 クラス、継承、仮想関数 (2/2) Form (コンテナ) Component Button Component TextForm Component CheckBox Button::Repaint TextForm::Repaint CheckBox::Repaint Component::Repaint Formは、Component達を管理していると思っている 再描画が必要な時、FormはComponent::Repaintを呼ぶ 実際には、派生クラスのメソッドButton::Repaint等が呼ばれる コンポーネントの種類が増えても、Formクラスの再コンパイルは不要
  • 21. University of Tokyo 21/51 インプットファイル (1/3) $ ./a.out 32 1.5 32 # SystemSize 1.5 # Temperature SystemSize=32 Tempreature=1.5 <PARAM name=SystemSize>32</PARAM> <PARAM name=Temperature>1.5</PARAM> プログラムとの結合 強い 弱い 実行時引数で指定 ファイルで順番に指定 ファイルで名前と値を指定 XMLの利用 これを採用
  • 22. University of Tokyo 22/51 インプットファイル (2/3) 結合度と可読性 XMLを採用するとlibXMLなどのライブラリの利用が必要 手で編集するのにXMLは不向き いま与えたい情報に対してXMLはオーバースペック → XMLは使わない 実装 ※ 直接手でいじらないデータをXMLで保存するのは良いと思う • Parameterクラス(parameter.cc/h) • 文字列ハッシュで管理 (std::map) • 「名前=値」の形式でずらずらならべる • Parameterクラスは全て文字列として保存 • 値を取り出す時に文字列を数値などに解釈
  • 23. University of Tokyo 23/51 インプットファイル (3/3) 1. 実行可能ファイルにインプットファイル名を渡す 2. main関数でファイル名を受け取り、計算管理クラスに渡す 3. 計算管理クラスが、受け取ったファイル名からParameterクラ スのインスタンスを作成 4. Parameterクラスのインスタンスを通じて値を受け取る ハッシュキーを渡し、値を受け取る double Parameter::GetDouble(string key) ハッシュキーが定義されていなかった場合、valueを値とする (より安全) double Parameter::GetDoubleDef(string key, double value) インプットファイルは必ずModeを定義しなければならない →複数のプロジェクトの管理(後述) 流れ 値の受け取り 特殊キー「Mode」
  • 25. University of Tokyo 25/51 複数のプロジェクトの扱い(2/5) switch(mode){ case PROJECTA: ProjectA(); break; case PROJECTB: ProjectB(); break; } int main(void){ //ProjectA(); //ProjectB(); ProjectC(); } プログラムと強結合 毎回mainを書き換える switch文で管理する こういうのは絶対イヤ 毎回再コンパイルが必要 プログラムは呼ばれる可能性のある プロジェクトを事前に知っていなけれ ばならない
  • 26. University of Tokyo 26/51 複数のプロジェクトの扱い(3/5) # 2d polygon nparticle bodies units lj dimension 2 atom_style body nparticle 2 6 read_data data.body velocity all create 1.44 87287 loop geom pair_style body 5.0 pair_coeff * * 1.0 1.0 neighbor 0.3 bin fix 1 all nve/body fix 2 all enforce2d #compute 1 all body/local type 1 2 3 #dump 1 all local 100 dump.body index c_1[1] c_1[2] c_1[3] c_1[4] thermo 500 run 10000 プログラムと弱結合 プログラムにスクリプトを食わせる形式 (ex: LAMMPS) github: lammps/examples/body/in.body 利点:  新しいプロジェクトを作っても再コンパイル不要      → ユーザから見て使いやすい 問題点:プログラマは大変      → 使う機能を全て事前に用意しておく必要がある 次元、力場、温度制御、 ループ数などを指定する
  • 27. University of Tokyo 27/51 複数のプロジェクトの扱い(4/5) 1. ユーザはProjectクラスから派生したクラス(ProjectC)を実装 2.コンストラクタで自分をProjectManagerに登録する ProjectA “ProjectA” ProjectB “ProjectB” ProjectC “ProjectC” ProjectManager ハッシュキー 自分自身のポインタ 登録 3. ハッシュキーからProjectを探し、Runメソッドを呼ぶ Mode=ProjectC Run ProjectA “ProjectA” ProjectB “ProjectB” ProjectManager ProjectC “ProjectC” Singletonパターンによる実装
  • 29. University of Tokyo 29/51 main関数の引数の扱い (1/4) main関数の引数を要求するクラスが、少なくとも2つある • MPI_Initは引数としてargc, argvを要求 • パラメータクラス: ファイル名の取得にargvが必要 誰がどうやって受け取るべきか? 強い 弱い プログラムとの結合 main関数の引数を要求するクラスのインスタンスを別々に作り そのインスタンスを計算管理クラスのコンストラクタに渡す main関数の引数を計算管理クラスのコンストラクタに 渡してその中で全部処理してしまう 設計変更
  • 30. University of Tokyo 30/51 main関数の引数の扱い (2/4) 案1: argc, argvをMPI管理クラス(MPIInfo)とパラメータ管理クラス (Parameter)それぞれのコンストラクタに渡し、それらのポインタを 管理クラスのコンストラクタに渡す。 flat-MPI版コードではこちらを採用 設計的にはこれがまっとうな気もする。 argc,argv main MPIInfo Parameter argc,argv argc,argv 計算管理クラス MPIInfo, Parameterのインスタンスを作成 管理クラスのコンストラクタに渡す
  • 31. University of Tokyo 31/51 main関数の引数の扱い (3/4) 案2: 計算管理クラスにargc, argvを渡し、コンストラクタで MPI_Initの処理やParameterのインスタンスを作る ハイブリッド版コードではこちらを採用 プログラム設計的にはあまりよろしくない argc,argv main MPI_Init Parameter argc,argv argc,argv 計算管理クラス int main(int argc, char *argv[]){ MDManager mdm(argc, argv); } main関数は何もしない。渡されたargc, argvをそのまま 計算管理クラスのコンストラクタにスルー
  • 32. University of Tokyo 32/51 main関数の引数の扱い (4/4) Q. なぜ全て計算管理クラスに詰め込んだのですか? 分けたほうが設計がきれいだと思いますが? A. 分けるご利益があまりないと考えたから その他雑多な言い訳 ・MPIInfo、Parameterクラスのインスタンスは、どちらもMDManagerのメンバ になっており、ライフタイムを共有している。MDManagerとライフタイムを共有 するクラスのインスタンスを外で作って渡す、というのがどうにも気持ち悪かった。 ・プロセスの化身であるMDManagerが、自分のランクを自分で知らない、という のが気持ち悪い気がした。「プロセスの化身」は誰か?MDManagerか? MPIInfoか? ・main関数はなるべく簡素化したい(これは単に趣味)。
  • 33. University of Tokyo 33/51 力の計算ルーチン (1/2) プログラムとの結合 強い 弱い 力の計算をベタに書いてしまう 力の計算ルーチンを機種ごとに仮想関数にする 粒子対ごとに力の計算式を仮想関数で指定 これを採用 • 力の計算はなるべく高速に実行したい • アーキテクチャごとに異なる最適化が必要 • 様々な種類の相互作用に対応したい
  • 34. University of Tokyo 34/51 力の計算ルーチン (2/2) 相互作用計算を仮想関数化 粒子の種類によって力の計算方法を変えたい 設計としては、力の計算を仮想関数にするのが一番きれい → 死ぬほど遅くなる 力の計算ルーチンを仮想関数化 せめてアーキテクチャ毎の力の計算を仮想関数にする? ForceCalcクラスからForceCalcforSPARC64を派生して・・・ → やっぱり遅くなる コンパイル時にどの関数が呼ばれるか決まらないと、プロシージャ間 最適化(Interprocedural optimization, IPO)が効かなくなることがあ るため 結局 #ifdef等でベタに指定する形に・・・
  • 36. University of Tokyo 36/51 通信の設計 (1/4) 簡単のため単純領域分割、flat-MPIのみ考える 領域更新を担当するクラスを作るのが自然 → ここではMDUnitと名付ける MDUnit MDUnit MDUnit MDUnit 実空間 分割された領域それぞれをMDUnitのインスタンスが管理 → 通信まわりをどう設計すべきか?
  • 37. University of Tokyo 37/51 通信の設計 (2/4) 案1: MDUnit同士が行う (強結合) MDUnit MDUnit ・「隣の領域に誰がいるか」をMDUnitが自分で知っている必要がある ・「領域更新」という局所的な役割と「通信」という大局的な役割の同居 がとても気持ち悪い → flat-MPI版では案1を採用 MDUnit MDUnit
  • 38. University of Tokyo 38/51 通信の設計 (3/4) 案2: MDUnitを管理するMDManagerクラスを作る MDUnit MDUnit MDUnit MDUnit MDManager ・MDUnitは自分が全体のどこに存在するか知らない ・通信は全てMDManagerを通して行う ・局所的役割と大局的役割の分離 → ハイブリッド版では案2を採用
  • 39. University of Tokyo 39/51 通信の設計 (4/4) MDManager 通信はMDManagerを通してのみ行いたい MDUnit MDUnit MDManager しかし実際には、ソースのどこからでもどこへでもMPI通信できる → MPIには本質的に「スコープ」が存在しない MDUnitに隣接する領域のランクを教えないことで 擬似的に「スコープ」を導入したつもりだが・・・ MPI通信とスコープ
  • 40. University of Tokyo 40/51 プロセス配置管理 (1/2) MPIでは、ノードをまたぐ通信量をなるべく減らすように プロセスを配置する 0 1 4 5 2 3 6 7 8 9 11 12 10 11 13 14 ハイブリッドだとさらにややこしくなる。 → どの領域に誰がいるかの「地図」の管理が必要 1ノード4プロセス、4ノード計算のプロセス配置例
  • 41. University of Tokyo 41/51 プロセス配置管理 (2/2) 案1: MPIInfoクラスを作って、そこで地図を管理 (疎結合) 通信するクラスがMPIInfoクラスのインスタンスを持つ 案2: MDManagerクラスが地図を直接管理してしまう (強結合) flat-MPIコードの開発では案1を採用したが、 ハイブリッドコードの開発では案2を採用 ハイブリッドコードでは、MDManagerのコンストラクタ、デストラクタで MPI_Init/Finalizeを呼び出すなど、MPIに関する情報を分離していない Flat-MPI版ではなるべく分離したが、分離するメリットがあまり感じられな かったため
  • 42. University of Tokyo 42/51 並列構造の隠蔽 (1/3) 全体処理の扱い 領域分割による並列化により、変数データが分散している 初期化や観測ルーチンなどの全体処理をどう書くべきか? 設計思想 ユーザから見えるのは計算管理クラス(MDManager)のみ 計算クラス(MDUnit)が管理するデータを触りたい なるべく並列化構造を意識したくない ユーザ 計算管理クラス MDUnit MDUnit 処理を依頼 ここでそれぞれの領域で処理 結果を返す MDUnit MDUnit 計算管理クラス 適宜通信
  • 43. University of Tokyo 43/51 並列構造の隠蔽 (2/3) MDManagerはExecuteAllメソッドを持つ MDManager::ExecuteAllはExecutorクラスのインスタンスを 支配下のMDUnit::Executeに渡すだけ void MDManager::ExecuteAll(Executor *ex) { #pragma omp parallel for schedule(static) for (int i = 0; i < num_threads; i++) { mdv[i]->Execute(ex); } } 実装 ユーザはExecutorクラスを派生したクラスを作り、 その中のExecuteメソッドをオーバーライドする
  • 44. University of Tokyo 44/51 並列構造の隠蔽 (3/3) MDManager MDUnit MDUnit Executor ExecuteAll Executor:: Execute Execute • ユーザが定義したExecutorのインスタンスはMDManagerを通 じてMDUnitに配布される • Executor::ExecuteにはMDUnitのインスタンスが渡されるので、 それを通じて好き放題できる • MDUnitは系のサイズや時間刻み等を知らないが、Executorク ラスのインスタンスを作るのはProject::Runの中なので、系のサ イズなどの情報を使える(コンストラクタで渡せる) 要するにコールバック関数 Project::Run 形の上では並列構造は隠蔽できたが、結局並列構造を 理解していないと中身を組めない・・・
  • 46. University of Tokyo 46/51 ソースを公開するということ (1/5) ソースを公開して良いことはあるだろうか? あまりフィードバックの価値のない文句は言われる バグ報告などはほとんど無い → 公開してもあまりいいことはない では、なぜそれでもソースを公開するのか そもそもデファクトスタンダードを目指していない ユーザを増やそうともしていない
  • 47. University of Tokyo 47/51 ソースを公開するということ (2/5) 原題:SHOWSTOPPER 「伝説のプログラマー」D. カトラーが Windows NTを作るお話
  • 48. University of Tokyo 48/51 ソースを公開するということ (3/5) Windows 9x系 Windows NT系 Windows 95 Windows 98 Windows 98SE Windows ME Windows NT 3.1 Windows NT 3.5 Windows NT 3.51 Windows NT 4.0 Windows 2000 Windows XP 家庭用 業務用 統合 9x系とNT系は全く異なるOS その統合期には多くの混乱があった
  • 49. University of Tokyo 49/51 ソースを公開するということ (4/5) Windows プログラミング WindowsにおけるプログラミングはAPIと呼ばれるものを使う 9x系からNT系へ 当時Windows 98で開発していたソフトが、Windows 2000で動 作しないという報告を受け取る 実機が無いためどうにもならなかったが、同様な機能を持つソフト がソースを公開しており、それを参考に修正→動作するように 異なるOSでも、同じAPIを使えば同じ動作が保証される・・・はず API (Application Programming Interface) OSが提供する機能(ファイルアクセスやマウスイベント取得)の利用 それまでソースは公開していなかったが、この一件以来 公開するように
  • 50. University of Tokyo 50/51 ソースを公開するということ (5/5) ソースは公開すべきだろうか? メリット/デメリットで言えば、個人的には公開する意味は薄いと思う しかし我々は、インターネットの海に浮かぶ様々な栄養を日常的に 摂取している。であれば、自らも何かフィードバックすべきでは? MDACPのソースを公開する理由 • 短距離MDのデファクトスタンダードを目指しているわけではない • 多くのユーザを獲得するためでもない • バグ報告などを期待しているわけでもない 「京」フルノードで動作が確認されたリファレンス実装として、これか ら並列コードを組む人が参考にするための資料として公開
  • 51. University of Tokyo 51/51 まとめ ・設計に正解はない  ・特に性能と拡張性・保守性の両立は難しい  ・とりあえず書いてみる (考えるより組む方が早い)  ・ただし、設計が良くないと思ったら書き直すこと ・並列プログラムは面倒くさい  ・並列化構造を隠蔽しようと試みた  ・複雑なことをやろうとすると、並列化構造の理解必須 ・ソースの公開について  ・無理にやらなくても良いと思う  ・文句を言うより、どうせなら言われる側になろう