[[ノート/ノート]]

**2009-07-03 生命科学系のプログラムの並列化の動向 [#uec93f29]
いくつかのページが面白かったので、リンクを残しておこう~
GPGPU & CHARMM で検索
-[[March 11, 2009  Accelerating Life Science and Bioinformatics Applications…As if Our Lives Depended on IT:http://www.hpcwire.com/topic/applications/Accelerating-Life-Science-and-Bioinformatics-Applications-41122667.html?viewAll=y]]  特にFloating Point Solutions with GPGPU and Cell Co-Processorsの項。 GPGPUの例ではNAMD (NAnoscale Molecular Dynamics), VMD (Visual Molecular Dynamics), and CHARMM (Chemistry at Harvard Macromolecular Mechanics).  Cellの例ではGROMACS (GROningen Machine for Chemical Simulations), a protein folding code that unlocks the mystery of protein assembly and its relationship to cancers, Parkinson's disease and Alzheimer's. が挙げられている
-[[U-DelのCS学生Project CISC849 - 011:http://gcl.cis.udel.edu/courses/cisc849011_sp08/project.php]] [[マテリアルはここ:http://gcl.cis.udel.edu/courses/cisc849011_sp08/project_wesandnabeel.pdf]]
-[[GPU Computing 3.0:http://www.ece.neu.edu/groups/nucar/GPGPU/GPGPU-2/Luebke.pdf]] の41ページ、46ページ
-U-DelのJoe Davisらのページ[[Towards Large-Scale Molecule Dynamics Simulations on Graphics Processors:http://www.imagwiki.org/mediawiki/images/e/e7/08_IMAG_TauferDavis.pdf]] 11ページ、14ページ、19ページ
-[[HaRiken "Harvard/Riken GPGPU Symposium 2008":http://sites.google.com/a/aspuru.com/hariken-08/HaRiken-Abstracts]]
-[[Genome Web 〜 Genome Technology:Not Just for Kids Anymore (September 2007):http://www.genomeweb.com/not-just-kids-anymore-0]]  VMD, NAMD, CHARMM
-[[SC07 High Performance Computing with CUDA 〜 Case Study: 〜 Molecular Dynamics:http://gpgpu.org/static/sc2007/SC07_CUDA_7_NAMD_Phillips.pdf]]
-本(Springer LNCS) [[Towards Large-Scale Molecular Dynamics Simulations on Graphics Processors:http://www.springerlink.com/content/757u77211847v755/]]
-[[Stream Computing for GPU-Accelerated HPC Applications (April 6th, 2009):http://www.browndeertechnology.com/docs/BDT_GPU_HPC_APPS_20090406.pdf]]
-[[Scalable molecular dynamics with NAMD.:http://www.citeulike.org/user/grondina/article/449842]] J Comput Chem, Vol. 26, No. 16. (December 2005), pp. 1781-1802.
-[[2009 Symposium on Application Accelerators in High Performance Computing (SAAHPC'09):http://saahpc.ncsa.illinois.edu/agenda.html]]
-[[北海道大学  大学院情報科学研究科  生命人間科学専攻 バイオインフォマティクス講座 構造バイオ情報科学研究室:http://ibio.jp/index.php]]

IBM Cell & CHARMMで検索
-PPT [[Studying Protein Folding on the Grid: Experiences Using CHARMM on NPACI Resources under Legion:http://legion.virginia.edu/presentations/HPDC-Aug2001.ppt]]
-Paper [[Studying protein folding on the grid: experiences using CHARMM onNPACI resources under Legion:http://ieeexplore.ieee.org/Xplore/login.jsp?url=http%3A%2F%2Fieeexplore.ieee.org%2Fiel5%2F7513%2F20446%2F00945172.pdf%3Farnumber%3D945172&authDecision=-203]]
-[[Protein folding with Charmm on Legion:http://www.hoise.com/primeur/01/articles/weekly/AE-PR-04-01-27.html]] San Diego 07 March 2001
-[[Studying protein folding on the Grid: experiences using CHARMM on NPACI resources under Legion:http://www.cs.virginia.edu/papers/Studying_Protein_Folding.pdf]] (CONCURRENCY AND COMPUTATION: PRACTICE AND EXPERIENCE, January 2004)

-[[MD Benchmarks for Amber, CHARMM and NAMD:http://ambermd.org/amber8.bench2.html]] (latest update: April, 2005)

NAMDのホームページ
-[[NAMD - Scalable Molecular Dynamics:www.ks.uiuc.edu/Research/namd/]]~
NAMD, recipient of a 2002 Gordon Bell Award, is a parallel molecular dynamics code designed for high-performance simulation of large biomolecular systems. Based on Charm++ parallel objects, NAMD scales to hundreds of processors on high-end parallel platforms and tens of processors on commodity clusters using gigabit ethernet. NAMD uses the popular molecular graphics program VMD for simulation setup and trajectory analysis, but is also file-compatible with AMBER, CHARMM, and X-PLOR. NAMD is distributed free of charge with source code. You can build NAMD yourself or download binaries for a wide variety of platforms. Our tutorials show you how to use NAMD and VMD for biomolecular modeling. 
-[[NAMD - Scalable Molecular Dynamics:http://www.ks.uiuc.edu/Research/namd/]]~
このHPより~
NAMD, recipient of a 2002 Gordon Bell Award, is a parallel molecular dynamics code designed for high-performance simulation of large biomolecular systems. Based on Charm++ parallel objects, NAMD scales to hundreds of processors on high-end parallel platforms and tens of processors on commodity clusters using gigabit ethernet. NAMD uses the popular molecular graphics program VMD for simulation setup and trajectory analysis, but is also file-compatible with AMBER, CHARMM, and X-PLOR. NAMD is distributed free of charge with source code. You can build NAMD yourself or download binaries for a wide variety of platforms. Our tutorials show you how to use NAMD and VMD for biomolecular modeling. ~
何せUniversity of Illinois at Urbana Champeignだから。

**2009-06-16 追記 (マルチコアと並列プログラミング) [#ucb1d184]
-Sourceforge magazine 記事 [[ソフトウェア高速化の鍵は「並列化」:いま注目される並列化技術を知る:http://sourceforge.jp/magazine/09/05/15/0930226]] に、マルチコア環境での並列ソフト技術の必要性を説く記事。

-[[情報処理学会誌「情報処理」2008年12月号 (Vol.49, No.12)「特集: マルチコアを生かすお手軽並列プログラミング」:http://fw8.bookpark.ne.jp/cm/ipsj/mokuji.asp?category1=Magazine&vol=49&no=12]] でマルチコア環境での並列ソフト技術の必要性を議論していた。

**2007-04-16 [#s72987f3]
この研究は、当面「卒論レベル」。何か新しいことが出てくるかどうかは
まだわからない。

***何をやるのか [#jdbafa4a]

やりたいこと: 現在コンピュータで(直列に)処理されているために、時間がかかって「困る」ような問題がある。それを並列実行して、早くする。

背景: (1)「マルチコア」のCPUが手ごろな値段で手に入るようになった。(4コアだと4並列、8コアだと8並列、かける CPU数(2つとか4つとか))~
    (2)大学にあるPC教室のPCを、空いている時間に使って、並列実行できる。(90台使えれば90並列)

先行研究: 山のようにある。並列処理は古くからの話題。~
 ポイント1: N台のCPUがあったとしても、なかなかN倍速くならない~
    (実は今までは並列で稼ぐよりCPUクロックを加速する方が簡単で安かった)~
    どれだけ速くなるかは、プログラムの性質による。このあたりの研究はたくさんある。~
    既に並列化されているプログラムもいくつか(かなりたくさん)ある。~
 ポイント2: 「並列化」は人手vs自動があり、人手は一般には大変。(他方問題によっては自明なものも多い) 自動化は今でも研究ネタ(たとえば吉田研)~

もう一度「やりたいこと」: とにかく並列にして速くできる問題を並列実行して、役に立ってみたい。

***環境など [#bc6277f8]

環境: 昨年度末に買ったHPのサーバーは4コア×2CPUで8並列可能。

OS: Linuxをインストール済み。プロセスレベルの並列処理は既に可能。後で例を示す。

並列ミドルウェア: プログラムを並列分割し、簡単に実行させられるプラットフォーム(ミドルウェア)がいくつかある。大別すると~
  共有メモリ型(変数共有型)モデル: ミドルウェアとしてOpenMPが有名。~
  メッセージ交換型モデル: インターフェースとしてMPIがあり、その実装としてフリーのMPICH/MPICH2がある。~
モデルとして比較すると、共有モデルは密な相互作用(細粒度の並列)が可能なのと、コンパイラが自動並列化するようなことが可能。たとえばIntelのコンパイラの-parallelオプション。ハードウェアの制約から並列度はそれほど大きくならない(せいぜい数十)~
メッセージモデルはメッセージ交換に時間がかかるので疎な相互作用(大粒度の並列)に向く。その代わり並列度は大きく出来る。(TCP/IPを使うのが流行だが、それだとほとんど無限まで可能。世界中のコンピュータをつなぐことも可能。)ネットワーク遅延を短縮する工夫も昔あった(Myrinetが有名)。ギガビットイーサの場合、転送は早いがセットアップに時間がかかると言われる。~

この辺の記述へのポインタをここに挙げる
-情報処理の記事[[マルチコアにおけるプログラミング(<特集>マルチコアにおけるソフトウェア):http://ci.nii.ac.jp/naid/10016924240/]]
-[[マルチコアCPUの恩恵を享受する方法:http://www.hpc.co.jp/hit/support/multicore.html]] 何とこれの最初の比較はBLASTだった
-石巻専修大学の授業 [[情報電子工学特別科目 特殊講義(後期):http://hyperion.ie.isenshu-u.ac.jp/ecc/sample/presentation/mitou_1.ppt]]
-教科書 [[マルチコアCPUのための並列プログラミング―並列処理&マルチスレッド入門 (単行本) :http://www.amazon.co.jp/%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B3%E3%82%A2CPU%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E4%B8%A6%E5%88%97%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E2%80%95%E4%B8%A6%E5%88%97%E5%87%A6%E7%90%86-%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E5%85%A5%E9%96%80-%E5%AE%89%E7%94%B0-%E7%B5%B9%E5%AD%90/dp/4798014621]]~
Amazonでの評判は悪いみたい 
-知識: MPI vs OpenMP = OpenMPはメモリ共有型のマルチプロセッサ対応のミドルウェア vs MPIは(TCP/IPを使った)メッセージパシング型のミドルウェア。メモリ共有型はCPU数に上限あるがメッセージ型は大きく出来る。その代わり、メモリ共有型はデータ交換が速いがメッセージ方は遅い。
-[[マルチコアCPUの恩恵を享受する方法:http://www.hpc.co.jp/hit/support/multicore.html]] によると、
-- 1 インテルコンパイラの -parallel オプションを使って並列化する方法…ソースコード変更不要 
-- 2 Intelの数値演算ライブラリを使って並列化する方法…並列化されたライブラリを呼び出せば高性能化 
-- 3 OpenMPを使って並列化する方法…並列化したい部分にOpenMPディレクティブ(指示行)を入れる 
-- 4 MPIを使って並列化する方法…MPI化は難易度が高い~
難易度が高いと言う理由は、インテルコンパイラだと自動並列化をしてくれるのに対し、MPI化は自分で並列化しなければならないから。~
それでも、いくつかのテキストが紹介されている。~
   [[理研でスパコン講習会に使ったテキスト:http://accc.riken.jp/HPC/training/text.html]]~
   [[「MPI並列プログラミング」:http://www.hpc.co.jp/hit/B-DEV/MPI-01.htm]](2001年)~


***レベル−1の予備実験~ [#bfbf7f32]
折角買ったサーバーなので、本当に並列実行できるか試してみた。~
CPUでの仕事だけ(ほとんど、だが)をするプログラムを作る。何でもいいが、余りに自明なプログラムだとコンパイラが賢いので命令を最適化=省いてしまうので要注意。プログラムは~
 #include <math.h>
 #include <stdio.h>
 #include <unistd.h>
 #include <string.h>
 
 main(int argc, char **argv) {
   int i, maxi;
   double x;
   char bufin[256];
 
   if (argc !=2) {
     fprintf(stderr, "usage: paratest <maxi>.  maxi=~~10000000\n");
   } else {
     maxi = atoi(argv[1]);
     if (maxi<=0) {
        fprintf(stderr, "maxi <= 0\n");
     }
   }
   for (i=0; i<255; i++) bufin[i]='\0';
   x = 0.0;
   for (i=0; i<maxi; i++) {
     x = x + sin( (double) i/maxi );
   }
 
   read(0, bufin, 256);
   printf("%s", strcat(bufin, "a"));
   fprintf(stderr, "%s", strcat(bufin, "a"));
 }

コンパイル時に-lmが必要。(Math Libraryを使っているため)

このプログラムをプロセスとして、並列実行させてみる。シェルレベルで並列起動、つまりcshellでの「&」や「|」を使う。最初に「&」を試したが、終了が判定しにくいので、「|」(パイプ)を使うことにする。~
決めた数のプロセスをパイプでつないで並列に起動する。最後にパイプを通じてメッセージが最後のプロセスに行き着いて、終了がわかる。このシェルスクリプトは~

 #!/bin/csh
 set N = 100000000
 
 # Case of 8 processes
 echo "" | pipebody $N | pipebody $N | pipebody $N | pipebody $N | pipebody $N | pipebody $ N | pipebody $N | pipebody $N
 
 # Case of 12 processes
 #echo "" | pipebody $N | pipebody $N | pipebody $N | pipebody $N | pipebody $N | pipebody $N | pipebody $N | pipebody $N | pipebody $N | pipebody $N | pebody $N | pipebody $N
 
 # Case of 1 process
 #echo "" | pipebody $N
 
のように書いた。

これを実行させる時に、コマンドtimeを使う。最近のLinuxのtimeコマンドは、~
 The default format string is
          %Uuser %Ssystem %Eelapsed %PCPU (%Xtext+%Ddata %Mmax)k
          %Iinputs+%Ooutputs (%Fmajor+%Rminor)pagefaults %Wswaps

ということで、昔ながらの real ... user ... sys ... という形式でないが、却って情報は分かりやすい。

結果は次のようになった。~
           user   system elapsed  PCPU~
 プロセス1つ:   9.720u  0.028s  0:09.74  100.0%   0+0k 0+0io 0pf+0w~
 プロセス4つ:  38.814u  0.036s  0:09.75  398.3%   0+0k 0+0io 0pf+0w~
 プロセス8つ:  77.476u  0.020s  0:09.76  793.9%   0+0k 0+0io 0pf+0w~
 プロセス9つ:  87.301u  0.040s  0:14.62  597.4%   0+0k 0+0io 0pf+0w~
 プロセス12:  116.407u  0.028s  0:15.93  730.8%  0+0k 0+0io 0pf+0w~
 プロセス16:  155.189u  0.044s  0:19.54  794.3%  0+0k 0+0io 0pf+0w

この環境では1つのプロセスが食うCPU時間は9.72秒程度であり、プロセス数を1⇒4⇒8まで増やした時にuser time(=プロセス総時間)は38.81秒=4×9.70秒、77.48秒=8×9.685のように増えているが、elapsed time(=端末で見ている時間)は3つとも9.74〜9.76秒でほとんど変わらない。つまり8並列まで実現できている。そのときのCPU percentage (PCPU) は398.3% 793.9%と、ほとんど並列度と同じ値を示している。

ところが、9プロセスを越えたところで、9つ目のプロセスは余ってしまい後から実行されるわけで、実際 elapsed time が(9.75秒から)14.6秒に伸びている。完全に2倍にならない理由は、おそらく外側のオーバーヘッドがあるためだろう。そして、9プロセス⇒12プロセス⇒16プロセスと増やしても elapsed time は多少増えるだけで倍増はしていない 14.6秒⇒15.9秒⇒19.5秒(16の場合多少微妙かも。大丈夫かな?)

ということから、8並列が実現されているらしいことは分かった。

***次のステップ [#yb5bcea8]
考えられる方向として、
-Intelのコンパイラの自動並列化機能が使えるか試した上で、本格的なプログラムを並列実行してみる。(やってみる、というレベルで興味あり。その程度)
-OpenMPを入れて、いじってみる。(やってみるというレベルかな。吉田研と一緒にやるといいかも)OpenMPだとメモリ共有型のみなので、実習室のPCを繋ぐという方向は無くなるだろう。
-MPICH2を入れて、いじってみる。
-例題プログラムを生物分子科からもらえる可能性があるので、それを試してみたい。タンパク質のX線回折による解析をするためのプログラムらしい。詳細はまだ。話によると、計算は値を変えて繰り返して計算するだけなので、それならば並列への分割はほぼ自明のはず。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS