SlideShare a Scribd company logo
1 of 40
Download to read offline
平成23年度生命情報科学科

生物データベース論
並列分散計算フレームワーク
     (9/13)
         笠原 雅弘
    mkasa@cb.k.u-tokyo.ac.jp
 東京大学 大学院新領域創成科学研究科
      情報生命科学専攻
公開版作成にあたって
• 以下の事項は仕様です。
 – 音声はありません。
 – 授業中に判明した typo 等は修正しました。
   一部、加筆・修正しています。
 – 字が細かいのは、この資料単独で自習できるように
   授業中はスライドに書かず喋った部分などを追加し
   ているからです。
 – アニメーションを解除するために、パラパラ漫画的な
   冗長なスライドが増えています。
• 間違い・提案・コメントなどがありましたらメール
  やコメント欄で連絡を下さい。歓迎です。
今日のトピック
• 並列計算とは?
• 並列化アプローチの多様性と階層
• 生物情報科学で今研究するべき並列化技術
今日のトピック
• 並列計算とは?
• 並列化アプローチの多様性と階層
• 生物情報科学で今研究するべき並列化技術
並列計算とは?
• 文字通り並列に計算すること。
 – ノード間並列(言語・フレームワーク・その他が混
   在;順序は適当)
  • MPI, PVM, MapReduce, BSP, Haloop, Pragel, Cilk Plus,
    Unified Parallel C, Chapel, X10, High-performance
    Fortran, Erlang, Sawzall, Pig, Hive, GXP, MegaScript, PJO,
    Prwake, Xcrypt, Taverna, SkeTo
 – ノード内並列(言語・フレームワーク・その他が混
   在;順序は適当)
  • pthread (C/C++/Java/Haskell/OCaml/Go/Scala …),
    OpenMP, Intel Thread Building Block, Parallel STL,
    PLINQ, Cilk, Axum, HPF, XPFortran, XcalableMP, Fortress,
    KL/1, Fortress, SIMD命令, GPGPU
“使われている”並列計算
• ほとんどの並列計算言語・フレームワーク・ライブラリ
  は実用で使われていません!
• 使われているモノ
 – 並列計算フレームワーク
   • MPI, MapReduce, BSP
 – 言語拡張・並列コンパイラ
   • OpenMP, 自動並列化 Fortran など
 – OS の機能
   • Pthread (C/C++/Java/Haskell/OCaml/Go/Scala …)
• 使われていないモノ
 – 並列計算言語
   • 新しい言語を覚えるのは敷居が高い、将来生き残るか不明。
   • 既存言語拡張と比べ周辺ライブラリなど環境が貧弱になりがち。
   • ユーザーが少ない独自言語はバグが残ってたり、使いにくい部分
     があったり、最適化が不十分などで困ることも多い
今日のトピック
• 並列計算とは?
• 並列化アプローチの多様性と階層
• 生物情報科学で今研究するべき並列化技術
並列化アプローチの多様性
• 並列計算のためのアプローチは多様
 – いろいろな切り口がある。


• まずは「並列」の階層で分類
並列化の階層
               1つの命令で複数の変数(レジスタ等)に
機械語命令レベル
               対して演算を行う。


               1つのプログラム(プロセス)が複数の
CPU core レベル
               CPU コアを同時に使用する。


               1つのマシン上で複数のプロセスを
プロセスレベル
               動作させる。


               1つのクラスター上で複数のノードを
 ノードレベル
               動作させる。


               地理的に離れたサイトにある複数の
 世界レベル
               マシンを協調させて計算に使う。
各レベルでの使用例を見てみる
                1つの命令で複数の変数(レジスタ等)に
機械語命令レベル
                対して演算を行う。


                1つのプログラム(プロセス)が複数の
 CPU core レベル
                CPU コアを同時に使用する。


                1つのマシン上で複数のプロセスを
 プロセスレベル
                動作させる。


                1つのクラスター上で複数のノードを
  ノードレベル
                動作させる。


                地理的に離れたサイトにある複数の
  世界レベル
                マシンを協調させて計算に使う。
機械語命令レベル
例)PADDW 命令 (x86_86環境)
レジスタ
         +      +      +      +         +    +    +    +
レジスタ
         ||     ||     ||     ||        ||   ||   ||   ||
レジスタ


   • Smith-Waterman アラインメントの並列化など
       – SIMD命令を初めて適用 [Wozniak ’97]
       – Query profile で高速化 [Rognes & Seeberg ‘02]
       – ストライピングで高速化 [Farrar ’06]
   • アラインメントの seed-and-extend ステップを高速化
       – mrFAST [Alkan et al ‘09]
       – mrsFAST [Hach et al ‘10]
       – GASSST [Rizk & Lavenier ’10]
各レベルでの使用例を見てみる
                1つの命令で複数の変数(レジスタ等)に
機械語命令レベル
                対して演算を行う。


                1つのプログラム(プロセス)が複数の
 CPU core レベル
                CPU コアを同時に使用する。


                1つのマシン上で複数のプロセスを
 プロセスレベル
                動作させる。


                1つのクラスター上で複数のノードを
  ノードレベル
                動作させる。


                地理的に離れたサイトにある複数の
  世界レベル
                マシンを協調させて計算に使う。
CPU core レベル
              物理CPU                           物理CPU
        CPU core     CPU core           CPU core      CPU core

        CPU core     CPU core           CPU core      CPU core


• 複数のCPUでアラインメント
  – bwa [Li & Durbin ‘09]
  – Bowtie [Langmead et al ‘
• 複数のCPUでゲノムアセンブリ
  –   Velvet [Zerbino & Berney ‘08]
  –   ABySS [Simpson et al ‘09] (複数ノードの)
  –   Ray [Boisvert ‘10]
  –   ALLPATHS-LG [Gnerre et al ‘10]
• 複数のCPUでSNV発見
  – The Genome Analysis Toolkit [McKenna et al ‘10]
  – Unified Genotyper [DePristo et al ‘10]
各レベルでの使用例を見てみる
                1つの命令で複数の変数(レジスタ等)に
機械語命令レベル
                対して演算を行う。


                1つのプログラム(プロセス)が複数の
 CPU core レベル
                CPU コアを同時に使用する。


                1つのマシン上で複数のプロセスを
 プロセスレベル
                動作させる。


                1つのクラスター上で複数のノードを
  ノードレベル
                動作させる。


                地理的に離れたサイトにある複数の
  世界レベル
                マシンを協調させて計算に使う。
プロセスレベル並列
                 ノード                                 ノード
        プロセス1         プロセス3                 プロセス5         プロセス6

        プロセス2         プロセス4                 プロセス7         プロセス8

                                               ノードをまたぐことも。
• 並列でベースコール
  – AltaCyclic [Erlich et al ’08]
• 並列でワークフロー
  – 特定の論文というわけではないが・・・
      • Sun Grid Engine (SGE, N1GE, OGE)/ Load Sharing Facility (LSF)/ Condor など
        を用いてソフトを繋ぐ方法はよく用いられる。
• 並列で SNV 発見
  – Unified Genotyper [DePristo et al ‘10]
    プロセスレベル並列は未だ開発中。
各レベルでの使用例を見てみる
                1つの命令で複数の変数(レジスタ等)に
機械語命令レベル
                対して演算を行う。


                1つのプログラム(プロセス)が複数の
 CPU core レベル
                CPU コアを同時に使用する。


                1つのマシン上で複数のプロセスを
 プロセスレベル
                動作させる。


                1つのクラスター上で複数のノードを
  ノードレベル
                動作させる。


                地理的に離れたサイトにある複数の
  世界レベル
                マシンを協調させて計算に使う。
ノードレベル並列
          ノード                           ノード         ノード
    プロセス        プロセス              プロセス    プロセス   プロセス   プロセス

    プロセス        プロセス              プロセス    プロセス   プロセス   プロセス

      プロセスレベル並列では、各プロセスが異なるプログラムあるいは異なる
      データを処理するのに対して、ノードレベル並列は「1つのアプリケーション」
      が複数のノードを活用すること。

•   複数のノードでゲノムアセンブリ
    – ABySS [Simpson et al ‘09]
    – Ray [Boisvert ‘10]
•   複数のノードでアラインメント
    – MPI-BLAST [Thorsen et al ‘07]
•   複数のCPUで構造計算
    – GAMESS/DDI [Olson et al ’03 など]
•   複数のノードでタンパク質構造計算
    – MARBLE, ProteinDF, etc.
各レベルでの使用例を見てみる
                1つの命令で複数の変数(レジスタ等)に
機械語命令レベル
                対して演算を行う。


                1つのプログラム(プロセス)が複数の
 CPU core レベル
                CPU コアを同時に使用する。


                1つのマシン上で複数のプロセスを
 プロセスレベル
                動作させる。


                1つのクラスター上で複数のノードを
  ノードレベル
                動作させる。


                地理的に離れたサイトにある複数の
  世界レベル
                マシンを協調させて計算に使う。
世界レベル
                   中央サーバー
                                         ユーザーの
                                          マシン
ユーザーの
 マシン                             ユーザーの
         ユーザーの                    マシン
          マシン
                     ユーザーの
                      マシン



 世界中のユーザーの空きCPU時間を利用して分散コンピューティング
 ・ユーザーマシン間の通信はなし(データが小さくて計算が長い場合に有効)


• タンパク質立体構造
 – Folding@home [Pande et al ’00~’11]
こんな本もあるぐらい
目次
1冊の本でこれだけのトピックが語れてしまうぐらい生物情報科学では並列化の
ネタが多い!
今日のトピック
• 並列計算とは?
• 並列化アプローチの多様性と階層
• 生物情報科学で今研究するべき並列化技術
最近の生物情報科学と
       並列計算
• なんといっても次世代DNAシークエンサーの
  並列情報処理がホット。
 – 出力データ量が膨大。
 – ちょっとした計算でも1マシンではすぐ限界に。
• なんでもかんでも並列計算にしてしまえ。
 – と言いたいところだけれども、並列計算の
   プログラムを書くのは結構めんどくさい作業。
 – 皆が工夫が必要であることに気づき始めた
   段階。
MPI並列プログラムの難しさ
• とにかくプログラム量が増える!ざっと2~3倍。
           – 例)台形公式による積分プログラム
                    • matsu© http://www.fireproject.jp/pc_cluster/mpi/intro/daikei.html
                                                                                                 MPI並列バージョン
                                                                                          Int main (int argc, char **argv)
                                                                                          {


                                 非並列バージョン                                                   int my_rank;
                                                                                            int p_num;
                                                                                                               /* 自分のプロセスランク */
                                                                                                              /* プロセッサ数 */
                                                                                            float x_min = X_MIN; /* 全体の閾値の最小値 */
                                                                                            float x_max = X_MAX; /* 全体の閾値の最大値 */
                                                                                            int div_num = DIV_NUM; /* 全体の閾値の分割数 */
                                                                                            float result;    /* 全体の積分値 */
                                                                                            float h;
                                                                                            float local_x_min; /* プロセッサ毎の閾値の最小値 */
                                                                                            float local_x_max; /* プロセッサ毎の閾値の最大値 */
                                                                                            int local_n;     /* プロセッサ毎の閾値の分割数 */
float                                                                                       float local_result; /* プロセッサ毎の積分値 */
                                                                                            int source;
daikei_integral (float (*function) (float), float x_min, float x_max, int n)                int dest = 0;
                                                                                            int tag = 0;
                                                                                            MPI_Status status;
{                                                                                             MPI_Init (&argc, &argv);
  float integral, h, x;                                                                       MPI_Comm_rank (MPI_COMM_WORLD, &my_rank);
                                                                                              MPI_Comm_size (MPI_COMM_WORLD, &p_num);

  int i;                                                                                      /* プロセス毎の閾値の算出 */
                                                                                              assign (p_num, my_rank, x_min, x_max, div_num, &local_x_min, &local_x_max,
                                                                                                &local_n);
                                                                                              /* プロセス毎に積分 */
                                                                                              local_result =
    h = (x_max - x_min) / n;                                                                  daikei_integral (function, local_x_min, local_x_max, local_n);


    integral = ((function (x_min)) + (function (x_max))) / 2.0;                               /* 各プロセッサの積分結果を収集 */
                                                                                              if (my_rank == 0)      /* プロセス0は全ての他プロセスから結果を受信 */
    x = x_min;                                                                                  {
                                                                                                fprintf (stdout, "P%d :: x = [%f,%f] : n = %d : s = %f¥n", 0,
    for (i = 1; i <= n - 1; i++) {                                                                  local_x_min, local_x_max, local_n, local_result);
                                                                                                result = local_result;
                                                                                                for (source = 1; source < p_num; source++)
      x += h;                                                                                     {
                                                                                                  MPI_Recv (&local_result, 1, MPI_FLOAT, source, tag,
      integral += (function (x));                                                                     MPI_COMM_WORLD, &status);

                                                                                                /* プロセス毎の結果出力 */
    }                                                                                           assign (p_num, source, x_min, x_max, div_num, &local_x_min,
                                                                                                  &local_x_max, &local_n);
    integral *= h;                                                                              fprintf (stdout, "P%d :: x = [%f,%f] : n = %d : s = %f¥n",
                                                                                                   source, local_x_min, local_x_max, local_n,
                                                                                                   local_result);
    return integral;                                                                             result += local_result;
}                                                                                              }
                                                                                                 }

                                                                                              else        /* プロセス0以外はプロセス0へ結果を送信 */
                                                                                               {
                                                                                               MPI_Send (&local_result, 1, MPI_FLOAT, dest, tag, MPI_COMM_WORLD);


デバッグの時間まで入れると非並列版と比べて軽く
                                                                                               }

                                                                                              if (my_rank == 0)
                                                                                                {


10倍は開発に時間がかかると見て良い。
                                                                                                fprintf (stdout, "TOTAL :: x = [%f,%f] : n = %d : S = %f¥n", X_MIN,
                                                                                                   X_MAX, DIV_NUM, result);
                                                                                                }

                                                                                              MPI_Finalize ();
                                                                                          }
Code Size (C/C++ only)
 一流IT企業でシニアプログラマが1年間に書くコード量でやっと 1,000KB程度
   MPI並列    •   ABySS                       449KB                  (v1.2.3)
   MPI並列 •      Ray                         344KB                  (v0.0.7)
   SMP並列 •      SOAPdenovo                    N/A
    非並列     •   Velvet                      731KB                  (v1.0.13)
     非並列    •   EULER-SR                  1,136KB                  (v1.1.2)
  非並列(一部並列) •   ALLPATH3                  6,395KB                  (build34923)
  非並列(一部並列) •   RAMEN                     1,278KB                  (v2, Sanger版)
     非並列    •   Phrap                       711KB                  (v0.990319)
   ノード並列 •      Celera                    6,951KB                  (v7.1)
   SMP並列 •      bwa                         330KB                  (v0.5.8c)
    SMP並列 •     BLAST+                    7,190KB                  (v2.2.24)
※プログラムの複雑度をサイズで       These numbers do not include external scripts, but may include materials not
測るのはとても良くない習慣!        directly related to the core algorithms.
生物情報科学で今
   研究するべき並列化技術1
• 並列計算プログラムを簡単に書く技術。
 – 実行効率・計算効率はほどほどでいい。
             並列計算効率の良いハードウェア・
             並列計算効率の良いアルゴリズム・
  従来型の研究    並列計算効率の良いプログラミング言語・
            並列計算効率の良い計算フレームワーク




             プログラミング効率の良い
  これからの研究
                 並列計算
なぜプログラミング効率か?
                数式を基にシミュレーションを行う。式は比較的簡潔でプログラムは短い。
従来型の研究          一度書いたプログラムを様々なデータ・パラメータで実行するので実行時間が重要。
数値解析的アプリ:
流体解析、構造シミュレー    プログラミング   実行    実行   実行   実行   実行
ション、衝突解析、金融計
算、天文シミュレーション、
気象予測、・・・
                                 ここが支配的


これからの研究         データの性質を調べながら試行錯誤してアルゴリズムを開発する。ヒューリス
                ティクスを多用し、例外ケース処理が多いのでプログラムは長くなりがち。一回
離散計算中心のアプリ:     しか実行しないプログラムも多い。(例:メダカとニワトリの染色体シンテニーを
ゲノムインフォマティクス、   計算する。自然科学の発見は一度きりなのでプログラミング時間が重要。)
自然言語処理、ウェブマイ
ニング、機械学習、・・・
                      プログラミング             実行


                     ここが支配的
なぜプログラミング効率か?
                数式を基にシミュレーションを行う。式は比較的簡潔でプログラムは短い。
従来型の研究          一度書いたプログラムを様々なデータ・パラメータで実行するので実行時間が重要。
数値解析的アプリ:
流体解析、構造シミュレー     実行時間を短くする
                プログラミング
                     実行 実行 実行            実行   実行
ション、衝突解析、金融計
算、天文シミュレーション、
気象予測、・・・
                  並列計算の研究
                                 ここが支配的


これからの研究         データの性質を調べながら試行錯誤してアルゴリズムを開発する。ヒューリス
                ティクスを多用し、例外ケース処理が多いのでプログラムは長くなりがち。一回
       「プログラミング時間+実行時間」を
離散計算中心のアプリ:
ゲノムインフォマティクス、
                しか実行しないプログラムも多い。(例:メダカとニワトリの染色体シンテニーを
                計算する。)
          短くする並列計算の研究
自然言語処理、ウェブマイ
ニング、機械学習、・・・
                      プログラミング           実行


                     ここが支配的
生物情報科学で今
    研究するべき並列化技術
• 並列計算プログラムを簡単に短く書く技術
 – 実行効率・計算効率はほどほどでいい
• 移植性のある並列計算プログラム・
  パイプラインシステム
 – いろいろな環境で動かしたい
• ファイル I/O を最適化する並列計算
  フレームワーク
 – 無駄なデータのやり取りを抑えて並列計算を
   したい
生物情報科学で今
    研究するべき並列化技術
• 並列計算プログラムを簡単に短く書く技術
 – 実行効率・計算効率はほどほどでいい
• 移植性のある並列計算プログラム・
  パイプラインシステム
 – いろいろな環境で動かしたい
• ファイル I/O を最適化する並列計算
  フレームワーク
 – 無駄なデータのやり取りを抑えて並列計算を
   したい
スケルトンプログラミング
        (Skeleton programming)
• Skeletal parallelism を利用したプログラミング。
• 発想
  – 以下のような部分はいろいろな並列プログラミン
    グで共有して使用されるパターン。ならばこの部
    分だけライブラリにして使いまわしてしまえ。
    穴埋め問題的にプログラミングをしてもらおう。
    •   データの分割
    •   ロードバランシング
    •   データの転送 (データの圧縮)
    •   ハードウェアエラーへの対処
    •   ソフトウェアエラーへの対処
並列スケルトンプログラミング
– 枠組みを用意して穴埋めでプログラムを書く
 • 例)Google MapReduce, Broad GATK
                 リード10億本

                 リード分割ルール

    入力1    入力2    入力3      ・・・・・    入力N

    処理     処理      処理               処理

    結果1    結果2    結果3      ・・・・・    結果N


                  集約ルール

                 アラインメント結果            ユーザー定義
MapReduce
• Map 関数と Reduce 関数を定義すればそれだけ
  で並列処理が行えるフレームワーク
                                                                                   ユーザー定義
                                          入力データ


            入力1           入力2              入力3                  ・・・・・        入力N

               map         map              map                              map             map

               k, v             k, v          k, v                            k, v
               k, v             k, v          k, v              ・・・・・         k, v
               k, v             k, v          k, v                            k, v
                                                                                              shuffle
                                                                                              (k ごとにまとめる)
  v, v, v, v          v, v, v          v, v, v, v, v, v, v, v       v      ・・・・・      v, v

   reduce             reduce                  reduce              reduce             reduce        reduce

                                          出力データ
MapReduce の例
   • 問題
        – 数兆単語を含むテキストファイルで、単語の出現頻度を
          カウントする。
void map(list<String> words):
  for word in words:
    emit(word, 1)

list<int> reduce(string word, list<int> freq):
   sum := 0
   for f in freq:
      sum += f
   return list<int>(sum) // sum 1要素からなるリストを返す




                                                 OSDI'04: Sixth Symposium on Operating System Design and
                                                 Implementation, San Francisco, CA, December, 2004
MapReduce の例
   • 問題
        – 数億 web ページについて、各ページからリンクしている URL のリスト
          が与えられている
        – すべての web ページについて、そのページにリンクしている web
          ページの URL リストを求める

void map(list<URL, URL> links):
  for link in links:
    emit(link.toURL, link.fromURL)

list<URL> reduce(URL base, list<URL> linkingPages):
   return linkingPages




                                                      OSDI'04: Sixth Symposium on Operating System Design and
                                                      Implementation, San Francisco, CA, December, 2004
MapReduce の例
   • 問題
        – 数十億本の short read について、bwa でヒトゲノムにアラインメント
          した結果を返す

void map(list<Read> shortReads):
  for read in shortReads: // 実際にはある程度まとめてバッチで処理
    bwaを起動してアラインメント
    emit(アラインした染色体名, 結果)

list<Alignment> reduce(string chromName, list<Alignment> result):
   return result




                                                        OSDI'04: Sixth Symposium on Operating System Design and
                                                        Implementation, San Francisco, CA, December, 2004
MapReduce の凄いところ
• map と reduce のたった2つの関数を定義すれば並列
  計算ができるところ・・・
 – ・・・・ではありません。
• ここが凄い(便利だ)よ!
 – ロードバランシングが自動。空いている CPU に仕事を振り
   分けてくれる。
 – Google File System (GFS) で入力ファイルのレプリカがなる
   べく近いノードに map を振りわける。
 – ラスト数%の Job は色々な原因で遅い(他のJobと干渉)・
   止まっている(ノード故障等)可能性があるので、投機的
   に再実行して早いほうを採用している。
 – エラーが出る入力レコードを自動スキップしてくれる。
 – 分散ソート (shuffle) が自動で行われる。
  並列分散計算はかなり色々な細かいところに気をつかうが、細かいところは
   全てフレームワークに任せて本質的な問題に集中できることが重要!
Apache Hadoop
オープンソースの Google File System / Google MapReduce 実装。
ゲノム計算で頻出のパターンを
   スケルトン化する
– 単純な分割パターン
 • ヒトゲノムへのリードマッピングの場合、
   「分割」「マッピング」と「マージ」だけユーザーが書く
– オーバーラップ付き分割
 • 例)
   Human ゲノムに mRNA-seq のショットガンデータを
   アラインメントすることを考える。Intron を考えると
   1つの染色体を単純に分割することはできない。
   Intron 最大長を 1Mb と仮定すると、1Mb ずつ
   オーバーラップさせてヒトゲノムを100 分割し、
   並列に処理することができる。

  オーバーラップ分を reduce (?) する処理は別途
  ユーザーが書いて与える。
生物情報科学で今
    研究するべき並列化技術
• 並列計算プログラムを簡単に短く書く技術
 – 実行効率・計算効率はほどほどでいい
• 移植性のある並列計算プログラム・
  パイプラインシステム   時間が足りない
 – いろいろな環境で動かしたい   ので今回はカット
• ファイル I/O を最適化する並列計算
  フレームワーク
 – 無駄なデータのやり取りを抑えて並列計算を
   したい           最後駆け足で
                   すみません・・・。

More Related Content

What's hot

デバドラを書いてみよう!
デバドラを書いてみよう!デバドラを書いてみよう!
デバドラを書いてみよう!Masami Ichikawa
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。Kazuki Onishi
 
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Hiraku Toyooka
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッドKohsuke Yuasa
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 sessionfreedom404
 
SpectreとMeltdown:最近のCPUの深い話
SpectreとMeltdown:最近のCPUの深い話SpectreとMeltdown:最近のCPUの深い話
SpectreとMeltdown:最近のCPUの深い話LINE Corporation
 
本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown本当にわかる Spectre と Meltdown
本当にわかる Spectre と MeltdownHirotaka Kawata
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングKohsuke Yuasa
 
パケットジェネレータipgenから見るnetmap
パケットジェネレータipgenから見るnetmapパケットジェネレータipgenから見るnetmap
パケットジェネレータipgenから見るnetmapfurandon_pig
 
イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術Kohsuke Yuasa
 
JRuby on Rails on JBoss
JRuby on Rails on JBossJRuby on Rails on JBoss
JRuby on Rails on JBossbose999
 

What's hot (12)

デバドラを書いてみよう!
デバドラを書いてみよう!デバドラを書いてみよう!
デバドラを書いてみよう!
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。
 
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 session
 
SpectreとMeltdown:最近のCPUの深い話
SpectreとMeltdown:最近のCPUの深い話SpectreとMeltdown:最近のCPUの深い話
SpectreとMeltdown:最近のCPUの深い話
 
本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
パケットジェネレータipgenから見るnetmap
パケットジェネレータipgenから見るnetmapパケットジェネレータipgenから見るnetmap
パケットジェネレータipgenから見るnetmap
 
イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術
 
JRuby on Rails on JBoss
JRuby on Rails on JBossJRuby on Rails on JBoss
JRuby on Rails on JBoss
 

Viewers also liked

生物情報科学科 ガイダンス (2016/5/17)
生物情報科学科 ガイダンス (2016/5/17)生物情報科学科 ガイダンス (2016/5/17)
生物情報科学科 ガイダンス (2016/5/17)Yosuke Tanigawa
 
20161222 米国大学院学生会説明会資料
20161222 米国大学院学生会説明会資料20161222 米国大学院学生会説明会資料
20161222 米国大学院学生会説明会資料Yosuke Tanigawa
 
ゲノム科学への招待
ゲノム科学への招待ゲノム科学への招待
ゲノム科学への招待Yosuke Tanigawa
 
MPI で順序の決まっていない通信をするとツラい訳
MPI で順序の決まっていない通信をするとツラい訳MPI で順序の決まっていない通信をするとツラい訳
MPI で順序の決まっていない通信をするとツラい訳Masahiro Kasahara
 
生物情報実験法(画像情報処理入門)
生物情報実験法(画像情報処理入門)生物情報実験法(画像情報処理入門)
生物情報実験法(画像情報処理入門)Tsukasa Fukunaga
 
PFNインターン最終発表: 怪我をしても歩ける6足歩行ロボットの学習
PFNインターン最終発表: 怪我をしても歩ける6足歩行ロボットの学習PFNインターン最終発表: 怪我をしても歩ける6足歩行ロボットの学習
PFNインターン最終発表: 怪我をしても歩ける6足歩行ロボットの学習Preferred Networks
 
PIAXで作る P2Pネットワーク
PIAXで作る P2PネットワークPIAXで作る P2Pネットワーク
PIAXで作る P2Pネットワーク祐司 伊藤
 
バイオインフォマティクスで実験ノートを取ろう
バイオインフォマティクスで実験ノートを取ろうバイオインフォマティクスで実験ノートを取ろう
バイオインフォマティクスで実験ノートを取ろうMasahiro Kasahara
 

Viewers also liked (8)

生物情報科学科 ガイダンス (2016/5/17)
生物情報科学科 ガイダンス (2016/5/17)生物情報科学科 ガイダンス (2016/5/17)
生物情報科学科 ガイダンス (2016/5/17)
 
20161222 米国大学院学生会説明会資料
20161222 米国大学院学生会説明会資料20161222 米国大学院学生会説明会資料
20161222 米国大学院学生会説明会資料
 
ゲノム科学への招待
ゲノム科学への招待ゲノム科学への招待
ゲノム科学への招待
 
MPI で順序の決まっていない通信をするとツラい訳
MPI で順序の決まっていない通信をするとツラい訳MPI で順序の決まっていない通信をするとツラい訳
MPI で順序の決まっていない通信をするとツラい訳
 
生物情報実験法(画像情報処理入門)
生物情報実験法(画像情報処理入門)生物情報実験法(画像情報処理入門)
生物情報実験法(画像情報処理入門)
 
PFNインターン最終発表: 怪我をしても歩ける6足歩行ロボットの学習
PFNインターン最終発表: 怪我をしても歩ける6足歩行ロボットの学習PFNインターン最終発表: 怪我をしても歩ける6足歩行ロボットの学習
PFNインターン最終発表: 怪我をしても歩ける6足歩行ロボットの学習
 
PIAXで作る P2Pネットワーク
PIAXで作る P2PネットワークPIAXで作る P2Pネットワーク
PIAXで作る P2Pネットワーク
 
バイオインフォマティクスで実験ノートを取ろう
バイオインフォマティクスで実験ノートを取ろうバイオインフォマティクスで実験ノートを取ろう
バイオインフォマティクスで実験ノートを取ろう
 

Similar to 生物データベース論(並列分散計算フレームワーク)

Lxc で始めるケチケチ仮想化生活?!
Lxc で始めるケチケチ仮想化生活?!Lxc で始めるケチケチ仮想化生活?!
Lxc で始めるケチケチ仮想化生活?!Etsuji Nakai
 
DTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめDTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめMikiya Okuno
 
分散メモリ環境におけるシェルスクリプトの高速化手法の提案
分散メモリ環境におけるシェルスクリプトの高速化手法の提案分散メモリ環境におけるシェルスクリプトの高速化手法の提案
分散メモリ環境におけるシェルスクリプトの高速化手法の提案Keisuke Umeno
 
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~Akira Inoue
 
8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティング8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティングTakeshi Takaishi
 
Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Hiro Yoshioka
 
Programming camp 2010 debug hacks
Programming camp 2010 debug hacksProgramming camp 2010 debug hacks
Programming camp 2010 debug hacksHiro Yoshioka
 
TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016
TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016
TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016RWSJapan
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, CodereadingHiro Yoshioka
 
C++によるソート入門
C++によるソート入門C++によるソート入門
C++によるソート入門AimingStudy
 
20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)Yoshifumi Yamaguchi
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~Akira Inoue
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPUTakuro Iizuka
 
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会Shigeru Hanada
 
Windows 8時代のUXを支える非同期プログラミング
Windows 8時代のUXを支える非同期プログラミングWindows 8時代のUXを支える非同期プログラミング
Windows 8時代のUXを支える非同期プログラミングYuya Yamaki
 
研究生のためのC++ no.7
研究生のためのC++ no.7研究生のためのC++ no.7
研究生のためのC++ no.7Tomohiro Namba
 
NGS解析を始めた時にぶつかりがちな小さい壁あれこれ
NGS解析を始めた時にぶつかりがちな小さい壁あれこれNGS解析を始めた時にぶつかりがちな小さい壁あれこれ
NGS解析を始めた時にぶつかりがちな小さい壁あれこれDNA Data Bank of Japan center
 
Open vSwitchソースコードの全体像
Open vSwitchソースコードの全体像 Open vSwitchソースコードの全体像
Open vSwitchソースコードの全体像 Sho Shimizu
 

Similar to 生物データベース論(並列分散計算フレームワーク) (20)

Lxc で始めるケチケチ仮想化生活?!
Lxc で始めるケチケチ仮想化生活?!Lxc で始めるケチケチ仮想化生活?!
Lxc で始めるケチケチ仮想化生活?!
 
DTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめDTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめ
 
分散メモリ環境におけるシェルスクリプトの高速化手法の提案
分散メモリ環境におけるシェルスクリプトの高速化手法の提案分散メモリ環境におけるシェルスクリプトの高速化手法の提案
分散メモリ環境におけるシェルスクリプトの高速化手法の提案
 
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
 
8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティング8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティング
 
Android gameprogramming
Android gameprogrammingAndroid gameprogramming
Android gameprogramming
 
Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011
 
Programming camp 2010 debug hacks
Programming camp 2010 debug hacksProgramming camp 2010 debug hacks
Programming camp 2010 debug hacks
 
MapReduce解説
MapReduce解説MapReduce解説
MapReduce解説
 
TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016
TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016
TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, Codereading
 
C++によるソート入門
C++によるソート入門C++によるソート入門
C++によるソート入門
 
20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
 
Windows 8時代のUXを支える非同期プログラミング
Windows 8時代のUXを支える非同期プログラミングWindows 8時代のUXを支える非同期プログラミング
Windows 8時代のUXを支える非同期プログラミング
 
研究生のためのC++ no.7
研究生のためのC++ no.7研究生のためのC++ no.7
研究生のためのC++ no.7
 
NGS解析を始めた時にぶつかりがちな小さい壁あれこれ
NGS解析を始めた時にぶつかりがちな小さい壁あれこれNGS解析を始めた時にぶつかりがちな小さい壁あれこれ
NGS解析を始めた時にぶつかりがちな小さい壁あれこれ
 
Open vSwitchソースコードの全体像
Open vSwitchソースコードの全体像 Open vSwitchソースコードの全体像
Open vSwitchソースコードの全体像
 

生物データベース論(並列分散計算フレームワーク)

  • 1. 平成23年度生命情報科学科 生物データベース論 並列分散計算フレームワーク (9/13) 笠原 雅弘 mkasa@cb.k.u-tokyo.ac.jp 東京大学 大学院新領域創成科学研究科 情報生命科学専攻
  • 2. 公開版作成にあたって • 以下の事項は仕様です。 – 音声はありません。 – 授業中に判明した typo 等は修正しました。 一部、加筆・修正しています。 – 字が細かいのは、この資料単独で自習できるように 授業中はスライドに書かず喋った部分などを追加し ているからです。 – アニメーションを解除するために、パラパラ漫画的な 冗長なスライドが増えています。 • 間違い・提案・コメントなどがありましたらメール やコメント欄で連絡を下さい。歓迎です。
  • 5. 並列計算とは? • 文字通り並列に計算すること。 – ノード間並列(言語・フレームワーク・その他が混 在;順序は適当) • MPI, PVM, MapReduce, BSP, Haloop, Pragel, Cilk Plus, Unified Parallel C, Chapel, X10, High-performance Fortran, Erlang, Sawzall, Pig, Hive, GXP, MegaScript, PJO, Prwake, Xcrypt, Taverna, SkeTo – ノード内並列(言語・フレームワーク・その他が混 在;順序は適当) • pthread (C/C++/Java/Haskell/OCaml/Go/Scala …), OpenMP, Intel Thread Building Block, Parallel STL, PLINQ, Cilk, Axum, HPF, XPFortran, XcalableMP, Fortress, KL/1, Fortress, SIMD命令, GPGPU
  • 6. “使われている”並列計算 • ほとんどの並列計算言語・フレームワーク・ライブラリ は実用で使われていません! • 使われているモノ – 並列計算フレームワーク • MPI, MapReduce, BSP – 言語拡張・並列コンパイラ • OpenMP, 自動並列化 Fortran など – OS の機能 • Pthread (C/C++/Java/Haskell/OCaml/Go/Scala …) • 使われていないモノ – 並列計算言語 • 新しい言語を覚えるのは敷居が高い、将来生き残るか不明。 • 既存言語拡張と比べ周辺ライブラリなど環境が貧弱になりがち。 • ユーザーが少ない独自言語はバグが残ってたり、使いにくい部分 があったり、最適化が不十分などで困ることも多い
  • 8. 並列化アプローチの多様性 • 並列計算のためのアプローチは多様 – いろいろな切り口がある。 • まずは「並列」の階層で分類
  • 9. 並列化の階層 1つの命令で複数の変数(レジスタ等)に 機械語命令レベル 対して演算を行う。 1つのプログラム(プロセス)が複数の CPU core レベル CPU コアを同時に使用する。 1つのマシン上で複数のプロセスを プロセスレベル 動作させる。 1つのクラスター上で複数のノードを ノードレベル 動作させる。 地理的に離れたサイトにある複数の 世界レベル マシンを協調させて計算に使う。
  • 10. 各レベルでの使用例を見てみる 1つの命令で複数の変数(レジスタ等)に 機械語命令レベル 対して演算を行う。 1つのプログラム(プロセス)が複数の CPU core レベル CPU コアを同時に使用する。 1つのマシン上で複数のプロセスを プロセスレベル 動作させる。 1つのクラスター上で複数のノードを ノードレベル 動作させる。 地理的に離れたサイトにある複数の 世界レベル マシンを協調させて計算に使う。
  • 11. 機械語命令レベル 例)PADDW 命令 (x86_86環境) レジスタ + + + + + + + + レジスタ || || || || || || || || レジスタ • Smith-Waterman アラインメントの並列化など – SIMD命令を初めて適用 [Wozniak ’97] – Query profile で高速化 [Rognes & Seeberg ‘02] – ストライピングで高速化 [Farrar ’06] • アラインメントの seed-and-extend ステップを高速化 – mrFAST [Alkan et al ‘09] – mrsFAST [Hach et al ‘10] – GASSST [Rizk & Lavenier ’10]
  • 12. 各レベルでの使用例を見てみる 1つの命令で複数の変数(レジスタ等)に 機械語命令レベル 対して演算を行う。 1つのプログラム(プロセス)が複数の CPU core レベル CPU コアを同時に使用する。 1つのマシン上で複数のプロセスを プロセスレベル 動作させる。 1つのクラスター上で複数のノードを ノードレベル 動作させる。 地理的に離れたサイトにある複数の 世界レベル マシンを協調させて計算に使う。
  • 13. CPU core レベル 物理CPU 物理CPU CPU core CPU core CPU core CPU core CPU core CPU core CPU core CPU core • 複数のCPUでアラインメント – bwa [Li & Durbin ‘09] – Bowtie [Langmead et al ‘ • 複数のCPUでゲノムアセンブリ – Velvet [Zerbino & Berney ‘08] – ABySS [Simpson et al ‘09] (複数ノードの) – Ray [Boisvert ‘10] – ALLPATHS-LG [Gnerre et al ‘10] • 複数のCPUでSNV発見 – The Genome Analysis Toolkit [McKenna et al ‘10] – Unified Genotyper [DePristo et al ‘10]
  • 14. 各レベルでの使用例を見てみる 1つの命令で複数の変数(レジスタ等)に 機械語命令レベル 対して演算を行う。 1つのプログラム(プロセス)が複数の CPU core レベル CPU コアを同時に使用する。 1つのマシン上で複数のプロセスを プロセスレベル 動作させる。 1つのクラスター上で複数のノードを ノードレベル 動作させる。 地理的に離れたサイトにある複数の 世界レベル マシンを協調させて計算に使う。
  • 15. プロセスレベル並列 ノード ノード プロセス1 プロセス3 プロセス5 プロセス6 プロセス2 プロセス4 プロセス7 プロセス8 ノードをまたぐことも。 • 並列でベースコール – AltaCyclic [Erlich et al ’08] • 並列でワークフロー – 特定の論文というわけではないが・・・ • Sun Grid Engine (SGE, N1GE, OGE)/ Load Sharing Facility (LSF)/ Condor など を用いてソフトを繋ぐ方法はよく用いられる。 • 並列で SNV 発見 – Unified Genotyper [DePristo et al ‘10] プロセスレベル並列は未だ開発中。
  • 16. 各レベルでの使用例を見てみる 1つの命令で複数の変数(レジスタ等)に 機械語命令レベル 対して演算を行う。 1つのプログラム(プロセス)が複数の CPU core レベル CPU コアを同時に使用する。 1つのマシン上で複数のプロセスを プロセスレベル 動作させる。 1つのクラスター上で複数のノードを ノードレベル 動作させる。 地理的に離れたサイトにある複数の 世界レベル マシンを協調させて計算に使う。
  • 17. ノードレベル並列 ノード ノード ノード プロセス プロセス プロセス プロセス プロセス プロセス プロセス プロセス プロセス プロセス プロセス プロセス プロセスレベル並列では、各プロセスが異なるプログラムあるいは異なる データを処理するのに対して、ノードレベル並列は「1つのアプリケーション」 が複数のノードを活用すること。 • 複数のノードでゲノムアセンブリ – ABySS [Simpson et al ‘09] – Ray [Boisvert ‘10] • 複数のノードでアラインメント – MPI-BLAST [Thorsen et al ‘07] • 複数のCPUで構造計算 – GAMESS/DDI [Olson et al ’03 など] • 複数のノードでタンパク質構造計算 – MARBLE, ProteinDF, etc.
  • 18. 各レベルでの使用例を見てみる 1つの命令で複数の変数(レジスタ等)に 機械語命令レベル 対して演算を行う。 1つのプログラム(プロセス)が複数の CPU core レベル CPU コアを同時に使用する。 1つのマシン上で複数のプロセスを プロセスレベル 動作させる。 1つのクラスター上で複数のノードを ノードレベル 動作させる。 地理的に離れたサイトにある複数の 世界レベル マシンを協調させて計算に使う。
  • 19. 世界レベル 中央サーバー ユーザーの マシン ユーザーの マシン ユーザーの ユーザーの マシン マシン ユーザーの マシン 世界中のユーザーの空きCPU時間を利用して分散コンピューティング ・ユーザーマシン間の通信はなし(データが小さくて計算が長い場合に有効) • タンパク質立体構造 – Folding@home [Pande et al ’00~’11]
  • 23. 最近の生物情報科学と 並列計算 • なんといっても次世代DNAシークエンサーの 並列情報処理がホット。 – 出力データ量が膨大。 – ちょっとした計算でも1マシンではすぐ限界に。 • なんでもかんでも並列計算にしてしまえ。 – と言いたいところだけれども、並列計算の プログラムを書くのは結構めんどくさい作業。 – 皆が工夫が必要であることに気づき始めた 段階。
  • 24. MPI並列プログラムの難しさ • とにかくプログラム量が増える!ざっと2~3倍。 – 例)台形公式による積分プログラム • matsu© http://www.fireproject.jp/pc_cluster/mpi/intro/daikei.html MPI並列バージョン Int main (int argc, char **argv) { 非並列バージョン int my_rank; int p_num; /* 自分のプロセスランク */ /* プロセッサ数 */ float x_min = X_MIN; /* 全体の閾値の最小値 */ float x_max = X_MAX; /* 全体の閾値の最大値 */ int div_num = DIV_NUM; /* 全体の閾値の分割数 */ float result; /* 全体の積分値 */ float h; float local_x_min; /* プロセッサ毎の閾値の最小値 */ float local_x_max; /* プロセッサ毎の閾値の最大値 */ int local_n; /* プロセッサ毎の閾値の分割数 */ float float local_result; /* プロセッサ毎の積分値 */ int source; daikei_integral (float (*function) (float), float x_min, float x_max, int n) int dest = 0; int tag = 0; MPI_Status status; { MPI_Init (&argc, &argv); float integral, h, x; MPI_Comm_rank (MPI_COMM_WORLD, &my_rank); MPI_Comm_size (MPI_COMM_WORLD, &p_num); int i; /* プロセス毎の閾値の算出 */ assign (p_num, my_rank, x_min, x_max, div_num, &local_x_min, &local_x_max, &local_n); /* プロセス毎に積分 */ local_result = h = (x_max - x_min) / n; daikei_integral (function, local_x_min, local_x_max, local_n); integral = ((function (x_min)) + (function (x_max))) / 2.0; /* 各プロセッサの積分結果を収集 */ if (my_rank == 0) /* プロセス0は全ての他プロセスから結果を受信 */ x = x_min; { fprintf (stdout, "P%d :: x = [%f,%f] : n = %d : s = %f¥n", 0, for (i = 1; i <= n - 1; i++) { local_x_min, local_x_max, local_n, local_result); result = local_result; for (source = 1; source < p_num; source++) x += h; { MPI_Recv (&local_result, 1, MPI_FLOAT, source, tag, integral += (function (x)); MPI_COMM_WORLD, &status); /* プロセス毎の結果出力 */ } assign (p_num, source, x_min, x_max, div_num, &local_x_min, &local_x_max, &local_n); integral *= h; fprintf (stdout, "P%d :: x = [%f,%f] : n = %d : s = %f¥n", source, local_x_min, local_x_max, local_n, local_result); return integral; result += local_result; } } } else /* プロセス0以外はプロセス0へ結果を送信 */ { MPI_Send (&local_result, 1, MPI_FLOAT, dest, tag, MPI_COMM_WORLD); デバッグの時間まで入れると非並列版と比べて軽く } if (my_rank == 0) { 10倍は開発に時間がかかると見て良い。 fprintf (stdout, "TOTAL :: x = [%f,%f] : n = %d : S = %f¥n", X_MIN, X_MAX, DIV_NUM, result); } MPI_Finalize (); }
  • 25. Code Size (C/C++ only) 一流IT企業でシニアプログラマが1年間に書くコード量でやっと 1,000KB程度 MPI並列 • ABySS 449KB (v1.2.3) MPI並列 • Ray 344KB (v0.0.7) SMP並列 • SOAPdenovo N/A 非並列 • Velvet 731KB (v1.0.13) 非並列 • EULER-SR 1,136KB (v1.1.2) 非並列(一部並列) • ALLPATH3 6,395KB (build34923) 非並列(一部並列) • RAMEN 1,278KB (v2, Sanger版) 非並列 • Phrap 711KB (v0.990319) ノード並列 • Celera 6,951KB (v7.1) SMP並列 • bwa 330KB (v0.5.8c) SMP並列 • BLAST+ 7,190KB (v2.2.24) ※プログラムの複雑度をサイズで These numbers do not include external scripts, but may include materials not 測るのはとても良くない習慣! directly related to the core algorithms.
  • 26. 生物情報科学で今 研究するべき並列化技術1 • 並列計算プログラムを簡単に書く技術。 – 実行効率・計算効率はほどほどでいい。 並列計算効率の良いハードウェア・ 並列計算効率の良いアルゴリズム・ 従来型の研究 並列計算効率の良いプログラミング言語・ 並列計算効率の良い計算フレームワーク プログラミング効率の良い これからの研究 並列計算
  • 27. なぜプログラミング効率か? 数式を基にシミュレーションを行う。式は比較的簡潔でプログラムは短い。 従来型の研究 一度書いたプログラムを様々なデータ・パラメータで実行するので実行時間が重要。 数値解析的アプリ: 流体解析、構造シミュレー プログラミング 実行 実行 実行 実行 実行 ション、衝突解析、金融計 算、天文シミュレーション、 気象予測、・・・ ここが支配的 これからの研究 データの性質を調べながら試行錯誤してアルゴリズムを開発する。ヒューリス ティクスを多用し、例外ケース処理が多いのでプログラムは長くなりがち。一回 離散計算中心のアプリ: しか実行しないプログラムも多い。(例:メダカとニワトリの染色体シンテニーを ゲノムインフォマティクス、 計算する。自然科学の発見は一度きりなのでプログラミング時間が重要。) 自然言語処理、ウェブマイ ニング、機械学習、・・・ プログラミング 実行 ここが支配的
  • 28. なぜプログラミング効率か? 数式を基にシミュレーションを行う。式は比較的簡潔でプログラムは短い。 従来型の研究 一度書いたプログラムを様々なデータ・パラメータで実行するので実行時間が重要。 数値解析的アプリ: 流体解析、構造シミュレー 実行時間を短くする プログラミング 実行 実行 実行 実行 実行 ション、衝突解析、金融計 算、天文シミュレーション、 気象予測、・・・ 並列計算の研究 ここが支配的 これからの研究 データの性質を調べながら試行錯誤してアルゴリズムを開発する。ヒューリス ティクスを多用し、例外ケース処理が多いのでプログラムは長くなりがち。一回 「プログラミング時間+実行時間」を 離散計算中心のアプリ: ゲノムインフォマティクス、 しか実行しないプログラムも多い。(例:メダカとニワトリの染色体シンテニーを 計算する。) 短くする並列計算の研究 自然言語処理、ウェブマイ ニング、機械学習、・・・ プログラミング 実行 ここが支配的
  • 29. 生物情報科学で今 研究するべき並列化技術 • 並列計算プログラムを簡単に短く書く技術 – 実行効率・計算効率はほどほどでいい • 移植性のある並列計算プログラム・ パイプラインシステム – いろいろな環境で動かしたい • ファイル I/O を最適化する並列計算 フレームワーク – 無駄なデータのやり取りを抑えて並列計算を したい
  • 30. 生物情報科学で今 研究するべき並列化技術 • 並列計算プログラムを簡単に短く書く技術 – 実行効率・計算効率はほどほどでいい • 移植性のある並列計算プログラム・ パイプラインシステム – いろいろな環境で動かしたい • ファイル I/O を最適化する並列計算 フレームワーク – 無駄なデータのやり取りを抑えて並列計算を したい
  • 31. スケルトンプログラミング (Skeleton programming) • Skeletal parallelism を利用したプログラミング。 • 発想 – 以下のような部分はいろいろな並列プログラミン グで共有して使用されるパターン。ならばこの部 分だけライブラリにして使いまわしてしまえ。 穴埋め問題的にプログラミングをしてもらおう。 • データの分割 • ロードバランシング • データの転送 (データの圧縮) • ハードウェアエラーへの対処 • ソフトウェアエラーへの対処
  • 32. 並列スケルトンプログラミング – 枠組みを用意して穴埋めでプログラムを書く • 例)Google MapReduce, Broad GATK リード10億本 リード分割ルール 入力1 入力2 入力3 ・・・・・ 入力N 処理 処理 処理 処理 結果1 結果2 結果3 ・・・・・ 結果N 集約ルール アラインメント結果 ユーザー定義
  • 33. MapReduce • Map 関数と Reduce 関数を定義すればそれだけ で並列処理が行えるフレームワーク ユーザー定義 入力データ 入力1 入力2 入力3 ・・・・・ 入力N map map map map map k, v k, v k, v k, v k, v k, v k, v ・・・・・ k, v k, v k, v k, v k, v shuffle (k ごとにまとめる) v, v, v, v v, v, v v, v, v, v, v, v, v, v v ・・・・・ v, v reduce reduce reduce reduce reduce reduce 出力データ
  • 34. MapReduce の例 • 問題 – 数兆単語を含むテキストファイルで、単語の出現頻度を カウントする。 void map(list<String> words): for word in words: emit(word, 1) list<int> reduce(string word, list<int> freq): sum := 0 for f in freq: sum += f return list<int>(sum) // sum 1要素からなるリストを返す OSDI'04: Sixth Symposium on Operating System Design and Implementation, San Francisco, CA, December, 2004
  • 35. MapReduce の例 • 問題 – 数億 web ページについて、各ページからリンクしている URL のリスト が与えられている – すべての web ページについて、そのページにリンクしている web ページの URL リストを求める void map(list<URL, URL> links): for link in links: emit(link.toURL, link.fromURL) list<URL> reduce(URL base, list<URL> linkingPages): return linkingPages OSDI'04: Sixth Symposium on Operating System Design and Implementation, San Francisco, CA, December, 2004
  • 36. MapReduce の例 • 問題 – 数十億本の short read について、bwa でヒトゲノムにアラインメント した結果を返す void map(list<Read> shortReads): for read in shortReads: // 実際にはある程度まとめてバッチで処理 bwaを起動してアラインメント emit(アラインした染色体名, 結果) list<Alignment> reduce(string chromName, list<Alignment> result): return result OSDI'04: Sixth Symposium on Operating System Design and Implementation, San Francisco, CA, December, 2004
  • 37. MapReduce の凄いところ • map と reduce のたった2つの関数を定義すれば並列 計算ができるところ・・・ – ・・・・ではありません。 • ここが凄い(便利だ)よ! – ロードバランシングが自動。空いている CPU に仕事を振り 分けてくれる。 – Google File System (GFS) で入力ファイルのレプリカがなる べく近いノードに map を振りわける。 – ラスト数%の Job は色々な原因で遅い(他のJobと干渉)・ 止まっている(ノード故障等)可能性があるので、投機的 に再実行して早いほうを採用している。 – エラーが出る入力レコードを自動スキップしてくれる。 – 分散ソート (shuffle) が自動で行われる。 並列分散計算はかなり色々な細かいところに気をつかうが、細かいところは 全てフレームワークに任せて本質的な問題に集中できることが重要!
  • 38. Apache Hadoop オープンソースの Google File System / Google MapReduce 実装。
  • 39. ゲノム計算で頻出のパターンを スケルトン化する – 単純な分割パターン • ヒトゲノムへのリードマッピングの場合、 「分割」「マッピング」と「マージ」だけユーザーが書く – オーバーラップ付き分割 • 例) Human ゲノムに mRNA-seq のショットガンデータを アラインメントすることを考える。Intron を考えると 1つの染色体を単純に分割することはできない。 Intron 最大長を 1Mb と仮定すると、1Mb ずつ オーバーラップさせてヒトゲノムを100 分割し、 並列に処理することができる。 オーバーラップ分を reduce (?) する処理は別途 ユーザーが書いて与える。
  • 40. 生物情報科学で今 研究するべき並列化技術 • 並列計算プログラムを簡単に短く書く技術 – 実行効率・計算効率はほどほどでいい • 移植性のある並列計算プログラム・ パイプラインシステム 時間が足りない – いろいろな環境で動かしたい ので今回はカット • ファイル I/O を最適化する並列計算 フレームワーク – 無駄なデータのやり取りを抑えて並列計算を したい 最後駆け足で すみません・・・。