KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

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/