openmpiを使用すると、--rankfileオプションを使用してランクを明示的に設定できます。
ファイルの構文は、ここで見つけることができます:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sched.h>
#include <mpi.h>
#include <omp.h>
void main(int argc, char** argv)
{
MPI_Init(&argc, &argv);
unsigned cpu;
unsigned node;
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
#pragma omp parallel
{
printf("[%d:%d] %d\n", rank, omp_get_thread_num(), sched_getcpu());
}
MPI_Finalize();
}
[MPI_rank:OMP_rank]印刷します:各OpenMPスレッドのCPUを^
https://www.open-mpi.org/doc/v2.0/man1/mpirun.1.php
ここでは、非常にシンプルなMPI + OpenMPプログラムです。
rankfilesのための基本的な形式は次のとおりです。この基本的なrankfile(ホスト=マーヴィン、1つのスロット上の2CPU)で
rank <rank>=<host> slot=<slot>:<cores>
:
>cat ./rankfile
rank 0=Marvin slot=0:0
rank 1=Marvin slot=0:0
rank 2=Marvin slot=0:0
rank 3=Marvin slot=0:1
rank 4=Marvin slot=0:0-1
rank 5=Marvin slot=0:0
これらは私の版画です:
>mpirun -n 6 --rankfile ./rankfile ./main
[0:0] 0
[1:0] 0
[2:0] 0
[3:0] 1
[4:0] 1
[4:1] 0
[5:0] 0
OMP_NUM_THREADS環境変数を設定していないため、OpenMPが各コアで使用可能なコア数を検出できるようにしましたランク。
ご希望の場合は、
へようこそ! [Slurm](https://slurm.schedmd.com/sbatch.html)のようなジョブマネージャを使用している場合、 'sbatch'コマンドは有用と思われる' --exclusive'オプションを備えていますが、他のユーザが泣くかもしれません。 PBSの '' qsub'には、 '' node-exclusive'に対応するオプション '-n'があります。クラスタにジョブマネージャがありますか?あなたが単独でクラスタにいて、 'mpirun'を直接実行していて、別のホストファイルを使用しているなら、maxslotsを指定することはそのトリックを行うことができます。 [mpirun](https://www.open-mpi.org/faq/?category=running#mpirun-hostfile)の '--bynode'オプションを見てください。 – francis
ジョブマネージャを使用していません。mpirunとhostfileを使用しています。 1つのノードに1つのスロットが必要なので、私は "slot = 1"をhostfileに記述しました。私はこの単一のスロットにそのノード内のすべてのCPUを使用したい。 --bynodeオプションを使用すると、ラウンドロビン方式でジョブが配布されます。 CPU /リソースを明示的に割り当てるオプションはありますか?ありがとうございました。 –