「並列計算の実行」の版間の差分
ナビゲーションに移動
検索に移動
(→アレイジョブ) |
|||
(同じ利用者による、間の8版が非表示) | |||
1行目: | 1行目: | ||
== 並列計算について == | == 並列計算について == | ||
並列計算は「マルチプロセス」および「マルチスレッド」と呼ばれるものに分けられます。 | 並列計算は「マルチプロセス」および「マルチスレッド」と呼ばれるものに分けられます。 | ||
*マルチプロセス: | *マルチプロセス: 複数のプロセスを生成して並列処理するプログラム、メモリは共有しない | ||
*マルチスレッド: プロセスが複数スレッドを持ち、並列処理するプログラム、メモリを共有する | *マルチスレッド: プロセスが複数スレッドを持ち、並列処理するプログラム、メモリを共有する | ||
[[画像:multi.jpg|500px]]<br> | [[画像:multi.jpg|500px]]<br> | ||
当システムにおいては、 | 当システムにおいては、 | ||
*分散処理計算機クラスタ:「マルチプロセス」用(small, medium, large キュー) | *分散処理計算機クラスタ:「マルチプロセス」用(small, medium, large キュー) | ||
* | *共有メモリ型計算サーバ:「大容量のメモリを使用するマルチスレッド」用(smpX キュー) | ||
マルチプロセス並列計算においては、それぞれのプロセス同士で独立した計算が可能でないと並列化できません。 | マルチプロセス並列計算においては、それぞれのプロセス同士で独立した計算が可能でないと並列化できません。 | ||
互いの結果が影響し合うような並列計算には向いていません<br> | 互いの結果が影響し合うような並列計算には向いていません<br> | ||
マルチスレッド並列計算は主にソフトウェアの仕様により、オプションを付けることで並列化される場合が多いです。(例: | マルチスレッド並列計算は主にソフトウェアの仕様により、オプションを付けることで並列化される場合が多いです。(例: BLAST+の -num_threads オプション, tophatの -p オプションなど)<br> | ||
== マルチプロセス == | == マルチプロセス == | ||
38行目: | 38行目: | ||
== マルチスレッド == | == マルチスレッド == | ||
* | * メモリを共有するため、複数ノードにわたる並列化を行うことができません。<br> | ||
* ソフトcufflinks, 4並列の例: | * ソフトcufflinks, 4並列の例: | ||
48行目: | 48行目: | ||
似たようなジョブをいくつも用意するのは面倒ですが、そんな時に便利な「アレイジョブ」という機能があります。<br> | 似たようなジョブをいくつも用意するのは面倒ですが、そんな時に便利な「アレイジョブ」という機能があります。<br> | ||
*オプション '''-J 開始番号-終了番号''' <br> | *オプション '''-J 開始番号-終了番号''' <br> | ||
ジョブファイルの中で、変数 '''$ | ジョブファイルの中で、変数 '''$PBS_ARRAY_INDEX''' にアレイジョブ数がセットされ、インクリメントしながら実行されます。<br> | ||
#!/bin/sh | #!/bin/sh | ||
#PBS -J 1-100 | |||
#PBS -l ncpus=8 | #PBS -l ncpus=8 | ||
#PBS - | #PBS -l mem=8gb | ||
#PBS -q small | #PBS -q small | ||
cd {$PBS_O_WORKDIR} | cd {$PBS_O_WORKDIR} | ||
blastx -outfmt 5 | blastx -db swissprot -outfmt 5 -num_threads ${NCPUS} -query mydata.fasta.${PBS_ARRAY_INDEX} -out result.${PBS_ARRAY_INDEX} | ||
ジョブファイルの書き方で使い方はいろいろです。<br> | ジョブファイルの書き方で使い方はいろいろです。<br> | ||
*lsコマンドの結果を配列に格納し、配列の添字として ${PBS_ARRAY_INDEX} を使います。 | *lsコマンドの結果を配列に格納し、配列の添字として ${PBS_ARRAY_INDEX} を使います。 | ||
#!/bin/sh | #!/bin/sh | ||
#PBS - | #PBS -J 1-10 | ||
target=(`ls`) | target=(`ls`) | ||
program -i ${target[${PBS_ARRAY_INDEX}]} | program -i ${target[${PBS_ARRAY_INDEX}]} | ||
66行目: | 67行目: | ||
*${PBS_ARRAY_INDEX} は3から始まり2飛びでインクリメントされます。caseの添字として使います。 | *${PBS_ARRAY_INDEX} は3から始まり2飛びでインクリメントされます。caseの添字として使います。 | ||
#!/bin/sh | #!/bin/sh | ||
#PBS - | #PBS -J 3-7:2 | ||
case ${PBS_ARRAY_INDEX} in | case ${PBS_ARRAY_INDEX} in | ||
3) name=control1;; | 3) name=control1;; |
2024年6月10日 (月) 04:22時点における最新版
並列計算について
並列計算は「マルチプロセス」および「マルチスレッド」と呼ばれるものに分けられます。
- マルチプロセス: 複数のプロセスを生成して並列処理するプログラム、メモリは共有しない
- マルチスレッド: プロセスが複数スレッドを持ち、並列処理するプログラム、メモリを共有する
- 分散処理計算機クラスタ:「マルチプロセス」用(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}