次のコードは、OpenMP部分の前にCPUアフィニティマスクを保存し、パラレル領域の期間中すべてのCPUを許可して以前のCPUアフィニティマスクを復元する方法を示しています。このコードはLinux特有のもので、MPIライブラリでプロセスピンを有効にしないとがになり、Open MPIで--bind-to-core
または--bind-to-socket
をmpiexec
に渡すと意味がありません。 無効化I_MPI_PIN
〜disable
をインテルMPIに設定してください(デフォルトで4.xはプロセスをピン止めしています)。
#define _GNU_SOURCE
#include <sched.h>
...
cpu_set_t *oldmask, *mask;
size_t size;
int nrcpus = 256; // 256 cores should be more than enough
int i;
// Save the old affinity mask
oldmask = CPU_ALLOC(nrcpus);
size = CPU_ALLOC_SIZE(nrcpus);
CPU_ZERO_S(size, oldmask);
if (sched_getaffinity(0, size, oldmask) == -1) { error }
// Temporary allow running on all processors
mask = CPU_ALLOC(nrcpus);
for (i = 0; i < nrcpus; i++)
CPU_SET_S(i, size, mask);
if (sched_setaffinity(0, size, mask) == -1) { error }
#pragma omp parallel
{
}
CPU_FREE(mask);
// Restore the saved affinity mask
if (sched_setaffinity(0, size, oldmask) == -1) { error }
CPU_FREE(oldmask);
...
また、OpenMPの実行時のピン留め引数を微調整することができます。 GCC/libgomp
の場合、アフィニティはGOMP_CPU_AFFINITY環境変数によって制御されますが、Intelコンパイラの場合はKMP_AFFINITYです。 OpenMPランタイムが、提供された親和性マスクとプロセスの親和性マスクと交差する場合は、上記のコードを引き続き使用できます。
ちょうど完全を期すために - 、省エネの設定およびWindows上でのアフィニティー・マスクを復元:
#include <windows.h>
...
HANDLE hCurrentProc, hDupCurrentProc;
DWORD_PTR dwpSysAffinityMask, dwpProcAffinityMask;
// Obtain a usable handle of the current process
hCurrentProc = GetCurrentProcess();
DuplicateHandle(hCurrentProc, hCurrentProc, hCurrentProc,
&hDupCurrentProc, 0, FALSE, DUPLICATE_SAME_ACCESS);
// Get the old affinity mask
GetProcessAffinityMask(hDupCurrentProc,
&dwpProcAffinityMask, &dwpSysAffinityMask);
// Temporary allow running on all CPUs in the system affinity mask
SetProcessAffinityMask(hDupCurrentProc, &dwpSysAffinityMask);
#pragma omp parallel
{
}
// Restore the old affinity mask
SetProcessAffinityMask(hDupCurrentProc, &dwpProcAffinityMask);
CloseHandle(hDupCurrentProc);
...
(64個の論理プロセッサまで)単一プロセッサグループで動作するはずです。
これはちょうどうまくいくと思います。ピン設定が有効になっていませんか? 'I_MPI_PIN'設定を確認してください。 –
プロセスのピン設定が有効になっていることは間違いありません。あなたがそれを無効にすると、あなたのMPIプロセスはもはやコアバウンドにならなくなり、MPIパーツのパフォーマンスは低下するということです。あなたはCPUマスクをプログラマチックに変更することができます - それを保存し、OpenMPフェーズのすべてのプロセッサを許可し、マスクを復元します。 –