並列計算の実行

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

並列計算について

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

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

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

  • 分散処理計算機クラスタ:「マルチプロセス」用(small, medium, large キュー)
  • 共有メモリ型計算サーバ:「大容量のメモリを使用するマルチスレッド」用(smpX キュー)

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

マルチプロセス

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

  • 大きなジョブを小さく分割する
  • MPI対応のソフトウェアを利用する

MPI

MPIマルチプロセスの並列計算には、利用するホスト数とCPU数を指定します。

  • 環境はOpenMPIです。
  • MPI対応のソフトウェアのコンパイラに「mpicc」が用意されています。
  • MPI並列ジョブ用スクリプト(2ノード x 40cpu、80並列)
#!/bin/sh
#PBS -l select=2:ncpus=40

export PATH=/usr/mpi/gcc/openmpi-3.1.0rc2/bin:$PATH
export LD_LIBRARY_PATH=/usr/mpi/gcc/openmpi-3.1.0rc2/lib64:$LD_LIBRARY_PATH
cd ${PBS_O_WORKDIR}
 
mpirun -n ${NCPUS} -hostfile ${PBS_NODEFILE} myprog -option
  • PBS環境変数:${NCPUS} に、指定した ncpus数が入ります。mpirun -n ${NCPUS} を必ずつけてください
  • PBS環境変数:${PBS_NODEFILE} に、ジョブが実行されるノードのホスト名が入ります。

マルチスレッド

  • メモリを共有できないため、複数ノードにわたる並列化を行うことができません。
  • ソフトcufflinks, 4並列の例:
#!/bin/sh
#PBS -l ncpus=4
cufflinks -p 4 aligned_reads.sam

アレイジョブ

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

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

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

#!/bin/sh
#PBS -J 1-100
#PBS -l ncpus=8
#PBS -l mem=8gb
#PBS -q small
cd {$PBS_O_WORKDIR}
blastx -db swissprot -outfmt 5 -num_threads ${NCPUS} -query mydata.fasta.${PBS_ARRAY_INDEX} -out result.${PBS_ARRAY_INDEX}

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

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