SLURMとNUMAノードについて
| 登録日 | :2024/05/21 04:35 |
|---|---|
| カテゴリ | :SLURM |
NUMA (Non-Uniform Memory Access) アーキテクチャは、特にAMD EPYCプロセッサなどのマルチソケットおよびマルチコアシステムで一般的です。NUMAノード設定を適切に行うことで、メモリアクセスの効率を向上させ、パフォーマンスの向上が期待できます。
NUMAノードの基本概念
NUMAシステムでは、メモリはノードごとに分割され、各プロセッサがローカルメモリとリモートメモリにアクセスします。ローカルメモリへのアクセスは高速ですが、リモートメモリへのアクセスは遅くなります。そのため、ジョブやプロセスがローカルメモリを優先的に使用するように設定することが重要です。
SLURMでのNUMAノード設定
SLURMを使用してNUMAノードを設定する際、以下のオプションを使用します。
1. --nodes と --ntasks-per-node
各ノードに対してタスクを割り当てる設定です。
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=8
2. --cpus-per-task
各タスクに割り当てるCPUコアの数を設定します。
#SBATCH --cpus-per-task=2
3. --mem または --mem-per-cpu
ジョブに割り当てるメモリを設定します。
#SBATCH --mem=32G
4. --distribution
タスクをどのようにノードに分配するかを指定します。cyclic はタスクを循環的に配置し、block はブロック単位で配置します。
#SBATCH --distribution=cyclic
NUMAバインディングの例
以下の例は、SLURMでNUMAノードを意識したジョブスクリプトです。各ノードに8タスク、各タスクに2つのCPUコアを割り当てています。
#!/bin/bash
#SBATCH --job-name=CFX_job
#SBATCH --output=CFX_output_%j.txt
#SBATCH --error=CFX_error_%j.txt
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=8
#SBATCH --cpus-per-task=2
#SBATCH --time=01:00:00
#SBATCH --partition=compute
#SBATCH --mem-per-cpu=4G
#SBATCH --distribution=cyclic
モジュールのロード
module load ansys/CFX
環境変数の設定
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK # OpenMP用
export CFX5RSH=ssh # CFX用
NUMAバインディングの確認
numactl --show
ジョブの実行
cfx5solve -def input.def -par-local -partition $SLURM_NTASKS
NUMAバインディングの確認
ジョブが正しくNUMAノードにバインドされているか確認するために、numactl コマンドを使用します。
numactl --show
このコマンドは、現在のプロセスのNUMAバインディング情報を表示します。
最適化のポイント
プロセスとメモリのバインディング: プロセスを特定のNUMAノードにバインドし、そのノードのメモリを使用するように設定します。
環境変数の設定: OMP_NUM_THREADS や MKL_NUM_THREADS などの環境変数を適切に設定し、スレッド数を制御します。
まとめ
NUMAノードの設定は、特にマルチソケットおよびマルチコアシステムでのパフォーマンス向上に重要です。SLURMを使用してジョブスクリプトを適切に設定し、numactl で確認することで、メモリアクセスの効率を最大化できます。さらに具体的な問題やエラーメッセージがあれば、その情報に基づいてより詳細なアドバイスを提供できますので、お知らせください。
関連)
https://nonoco.believeriver.site/detail_mark/264/