クラスターはノードのグループであり、各ノードは独立したコンピューター (多数の CPU といくつかの GPU またはその他のアクセラレーター) であり、ノードはネットワークによって接続されます (通常、スーパーコンピューターではメモリ アドレスがグローバルであることに注意してください)。次に、共有メモリと分散メモリの 2 種類のスーパーコンピュータがあります。
スーパーコンピューターのアーキテクチャについて少し読む価値があります... ウィキペディアは良い出発点です!
プロセスは独立した作業単位です。プロセスはメモリを共有しません。お互いのメモリにアクセスする方法が必要です。そのためには、MPI などのライブラリを使用します。
slurm では、プロセスはタスクと呼ばれます...
タスク (実際にはプロセス) の数を設定するには、-ntasks または単純に -n を使用します。次に、ノードごとのタスク数またはノード数を設定できます。これは2つの異なるものです!
--ntasks-per-node は、ノードごとのタスク数を示します --nodes は、必要なノードの最小数を示します。--nodes=2 を指定すると、最小で 2 つのノードを持つことになりますが、それ以上になる可能性があります...ノードに 18 コアがあり、40 のタスクを要求する場合、少なくとも 3 つのノードが必要です...これが --nodes の使用を避けるべき理由です (自分が何をしているのかを知っている場合を除きます!)
次に、特定の数の CPU (プロセッサのコア) を 1 つのタスクに割り当てることができます。これは --cpu-per-task を使用して設定されます。
1 つの MPI ランクが 1 つのタスクです。その後、タスクは複数のスレッドを起動できます。--cpu-per-task を 1 に設定すると、すべてのスレッドが同じコアで実行されます。したがって、リソースを競います。通常、コアごとに 1 つのスレッド (ハイパースレッディングを使用する場合は 2 つ) が必要です。
--cpu-per-task を設定する場合、タスクは 1 つのノードでしか実行できないため、ノードあたりのコア数を少なくする必要があります。(分散メモリ システム上)。
要約する:
したがって、それぞれ N スレッドを起動する M mpi プロセスを実行したい場合。最初の N は、ノードあたりのコア数よりも小さくする必要があります。ノードあたりのコア数の整数の除算器にすることをお勧めします (そうしないと、一部のコアが無駄になります)。
--ntasks="M" --cpus-per-task="N" を設定します。
次に、以下を使用して実行します: srun ./your_hybrid_app
次に、2 つのことを忘れないでください: OpenMP を使用する場合: スレッド数を設定します。
export OMP_NUM_THREADS="N"
マルチスレッド用にMPIを適切に初期化することを忘れないでください...
!/bin/bash -l
#
#SBATCH --account=myAccount
#SBATCH --job-name="a job"
#SBATCH --time=24:00:00
#SBATCH --ntasks=16
#SBATCH --cpus-per-task=4
#SBATCH --output=%j.o
#SBATCH --error=%j.e
export OMP_NUM_THREADS=4
srun ./your_hybrid_app
これにより、タスクごとに 4 コア (およびタスクごとに 4 つの OMP スレッド、したがってコアごとに 1 つ) で、16 のタスクが起動されます。