「並列計算の実行」の版間の差分

提供:biaswiki
ナビゲーションに移動 検索に移動
19行目: 19行目:


== MPI ==
== MPI ==
'''MPIマルチプロセスの並列計算には、並列実行環境:Parallel Environment(PE)と並列度を指定します。'''
'''MPIマルチプロセスの並列計算には、並列実行環境:Parallel Environment(PE)と並列度を指定します。'''<br>
環境はIntelMPIです。<br>
環境はIntelMPIです。<br>
MPI対応のソフトウェアのコンパイラに「mpicc」が用意されています。<br>
MPI対応のソフトウェアのコンパイラに「mpicc」が用意されています。<br>

2016年11月2日 (水) 07:49時点における版

並列計算について

並列計算は「マルチプロセス」および「マルチスレッド」と呼ばれるものに分けられます。

  • マルチプロセス: 複数の子プロセスを生成して並列処理するプログラム、メモリは共有しない
  • マルチスレッド: プロセスが複数スレッドを持ち、並列処理するプログラム、メモリを共有する

Multi.jpg
当システムにおいては、

  • 分散処理計算機クラスタ:「マルチプロセス」用(small, medium, large キュー)
  • 共有メモリ型計算サーバ:「マルチスレッド」用(bias, cat キュー)

マルチプロセス並列計算においては、それぞれのプロセス同士で独立した計算が可能でないと並列化できません。 互いの結果が影響し合うような並列計算には向いていません
マルチスレッド並列計算は主にソフトウェアの仕様により、オプションを付けることで並列化される場合が多いです。(例: BLASTの -a オプション, tophatの -p オプションなど)

マルチプロセス

大きく分けて2つの方法があります、

  • 大きなジョブを小さく分割する(PEの指定は不要、例: BLAST検索でクエリーを細かく分けてそれぞれをジョブスクリプトにする)
  • MPI対応のソフトウェアを利用する

MPI

MPIマルチプロセスの並列計算には、並列実行環境:Parallel Environment(PE)と並列度を指定します。
環境はIntelMPIです。
MPI対応のソフトウェアのコンパイラに「mpicc」が用意されています。
MPIを使った並列プログラムを実行する場合、並列実行環境:Parallel Environment(PE)と並列度を指定します。
利用可能なPE:

  • mpi256(最大256並列)
  • mpi128(最大128並列)

PEは、qsubのオプションか、ジョブスクリプト内で指定します。(PEにmpi64を指定、8並列で実行)

#!/bin/sh
#$ -pe mpi128 16

必要に応じて、mpirun にオプションをつけてください。

mpirun -np 16

ジョブが投入されると、その時点で指定した並列数のコアを掴むので、あまりに長時間・多並列なジョブの実行はお控えください。

マルチスレッド

メモリを共有できないため、複数ホストにわたる並列化を行うことができません。

  • PE:smp (ホストをまたがずにコアを確保します)

他のキューでも smp は利用できますが、ノードのコア数が最大並列数になります。
必要に応じて、コマンドにsmpに指定したのと同じ並列数を指定してください。
ソフトcufflinks, 4並列の例:

#!/bin/sh
#$ -q bias
#$ -pe smp 4
cufflinks -p 4 aligned_reads.sam

アレイジョブ

似たようなジョブをいくつも用意するのは面倒ですが、そんな時に便利な「アレイジョブ」という機能があります。

  • オプション  -t 開始番号-終了番号

ジョブファイルの中で、変数 $SGE_TASK_ID にアレイジョブ数がセットされ、インクリメントしながら実行されます。

#!/bin/sh
#$ -t 1-100
#$ -q small
blastall -p blastx -i query.$SGE_TASK_ID -o results.$SGE_TASK_ID

ジョブファイルの書き方で使い方はいろいろです。

  • lsコマンドの結果を配列に格納し、配列の添字として $SGE_TASK_ID を使います。
#!/bin/sh
#$ -t 1-10
target=(`ls`)
program -i ${target[$SGE_TASK_ID]}
  • $SGE_TASK_ID は3から始まり2飛びでインクリメントされます。caseの添字として使います。
#!/bin/sh
#$ -t 3-7:2
case $SGE_TASK_ID in
   3) name=control1;;
   5) name=control3;;
   7) name=phos1;;
esac
program -i $name

qstat での見え方はこうなります。 job-ID は一つで、最終カラム ja-task-ID に $SGE_TASK_ID が出ます。

job-ID prior  name user  state submit/start at       queue                slots  ja-task-ID
-----------------------------------------------------------------------------------------------
6597 0.5050 1job hiroyo r 07/19/2012 18:04:04 small@node03.local 1 3
6597 0.5050 1job hiroyo r 07/19/2012 18:04:04 small@node06.local 1 5
6597 0.5050 1job hiroyo r 07/19/2012 18:04:04 small@node08.local 1 7