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

提供:biaswiki
ナビゲーションに移動 検索に移動
編集の要約なし
 
(同じ利用者による、間の35版が非表示)
1行目: 1行目:
== 並列計算について ==
== 並列計算について ==
並列計算は「マルチプロセス」および「マルチスレッド」と呼ばれるものに分けられます。
並列計算は「マルチプロセス」および「マルチスレッド」と呼ばれるものに分けられます。
*マルチプロセス: 複数の子プロセスを生成して並列処理するプログラム、メモリは共有しない
*マルチプロセス: 複数のプロセスを生成して並列処理するプログラム、メモリは共有しない
*マルチスレッド: プロセスが複数スレッドを持ち、並列処理するプログラム、メモリを共有する
*マルチスレッド: プロセスが複数スレッドを持ち、並列処理するプログラム、メモリを共有する
[[画像:multi.jpg|500px]]<br>
[[画像:multi.jpg|500px]]<br>
当システムにおいては、
当システムにおいては、
*分散処理計算機クラスタ:「マルチプロセス」用(small, medium, large キュー)
*分散処理計算機クラスタ:「マルチプロセス」用(small, medium, large キュー)
*共有メモリ型計算サーバ:「マルチスレッド」用(bias, cat キュー)
*共有メモリ型計算サーバ:「大容量のメモリを使用するマルチスレッド」用(smpX キュー)


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


== マルチプロセス ==
== マルチプロセス ==


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


== MPI ==
== MPI ==
環境はOpenMPIです。<br>
'''MPIマルチプロセスの並列計算には、利用するホスト数とCPU数を指定します。'''<br>
MPI対応のソフトウェアのコンパイラに「mpicc」が用意されています。<br>
* 環境はOpenMPIです。<br>
MPIを使った並列プログラムを実行する場合、並列実行環境:Parallel Environment(PE)と並列度を指定します。<br>
* MPI対応のソフトウェアのコンパイラに「mpicc」が用意されています。<br>
利用可能なPE:
* MPI並列ジョブ用スクリプト(2ノード x 40cpu、80並列)
*mpi128(最大128並列)
 
*mpi64(最大64並列)
PEは、qsubのオプションか、ジョブスクリプト内で指定します。(PEにmpi64を指定、8並列で実行)
  #!/bin/sh
  #!/bin/sh
  #$ -pe mpi64 8
  #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


必要に応じて、mpirun にオプションをつけてください。
* PBS環境変数:${NCPUS} に、指定した ncpus数が入ります。mpirun -n ${NCPUS} を必ずつけてください
* PBS環境変数:${PBS_NODEFILE} に、ジョブが実行されるノードのホスト名が入ります。


mpirun -np 8
== マルチスレッド ==


ジョブが投入されると、その時点で指定した並列数のコアを掴むので、あまりに長時間・多並列なジョブの実行はお控えください。
* メモリを共有するため、複数ノードにわたる並列化を行うことができません。<br>


== マルチスレッド ==
* ソフトcufflinks, 4並列の例:
メモリを共有できないため、複数ホストにわたる並列化を行うことができません。<br>
*推奨利用キュー:bias(最大16並列)
*PE:smp (ホストをまたがずにコアを確保します)
他のキューでも smp は利用できますが、ノードのコア数が最大並列数になります。<br>
必要に応じて、コマンドに'''smpに指定したのと同じ'''並列数を指定してください。<br>
ソフトcufflinks, 4並列の例:
  #!/bin/sh
  #!/bin/sh
  #$ -q bias
  #PBS -l ncpus=4
#$ -pe smp 4
  cufflinks -p 4 aligned_reads.sam
  cufflinks -p 4 aligned_reads.sam


== アレイジョブ ==
== アレイジョブ ==
似たようなジョブをいくつも用意するのは面倒ですが、そんな時に便利な「アレイジョブ」という機能があります。
似たようなジョブをいくつも用意するのは面倒ですが、そんな時に便利な「アレイジョブ」という機能があります。<br>
オプション  '''-t 開始番号-終了番号'''   
*オプション  '''-J 開始番号-終了番号'''  <br>
ジョブファイルの中で、変数 '''$SGE_TASK_ID''' にアレイジョブ数がセットされ、インクリメントしながら実行されます。
ジョブファイルの中で、変数 '''$PBS_ARRAY_INDEX''' にアレイジョブ数がセットされ、インクリメントしながら実行されます。<br>
 
#!/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}
 
ジョブファイルの書き方で使い方はいろいろです。<br>
*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
  #!/bin/sh
  #$ -t 1-100
  #PBS -J 3-7:2
  #$ -q small
  case ${PBS_ARRAY_INDEX} in
  blastx -i query.$SGE_TASK_ID -o results.$SGE_TASK_ID
    3) name=control1;;
    5) name=control3;;
    7) name=phos1;;
esac
  program -i ${name}

2024年6月10日 (月) 04:22時点における最新版

並列計算について

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

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

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}