LSF ジョブ システムを備えたクラスタ上で MPI fortran プログラムを実行しています。私のプログラムには MKL 関数も含まれています。
MKLスレッド番号を設定できるサブルーチンがあることを知っています(たとえば、2に設定します)
call mkl_set_num_threads(2)
最初に、これがプログラムの合計スレッド数を設定すると思いました。しかし、私がテストしたように、これは各MPIプロセスのスレッド番号を設定しているようです
だから私が次のような仕事を提出した場合
bsub -n 2 mpiexec.hydra ./a.out
ノードにsshして、Top実際には4つのコアを使用し、各MPIプロセスは2つのスレッドを使用することがわかりました。
しかし、これは私のクラスターでは許可されていません。これは、要求された以上に CPU リソースを使用し、実行中に強制終了されるためです。
MPI プロセスの数が CPU コアを分割できない場合があります。たとえば、ノードに 24 コアがあり、実行する MPI プロセスが 7 つある場合、次のように送信します。
bsub -n 24 mpiexec.hydra -n 7 ./a.out
MKL にはDynamic機能があるため、MKL は自動的にリソースを 7 つの MPI タスクに動的に分配し、すべての CPU を効率的に使用します。
しかし、今ならクラスターは一杯です。リクエストできるのは 12 コアのみです。
bsub -n 12 mpiexec.hydra -n 7 ./a.out
次に、7 つの MPI タスクの中で正確に 12 の mkl スレッドを使用するように MKL を設定し、システムによって強制終了されず、最大の効率を維持する方法。