Đoạn mã sau cho thấy một ví dụ về cách lưu mặt nạ sở thích CPU trước phần OpenMP, thay đổi nó để cho phép tất cả CPU trong khoảng thời gian của vùng song song và sau đó khôi phục mặt nạ ái lực CPU trước đó. Mã này là Linux cụ thể và không có ý nghĩa nếu bạn không bật quá trình ghim bằng thư viện MPI - kích hoạt bằng cách chuyển --bind-to-core
hoặc --bind-to-socket
đến mpiexec
trong MPI mở; đã hủy kích hoạt bằng cách đặt I_MPI_PIN
thành disable
trong Intel MPI (mặc định trên 4.x là để ghim quy trình).
#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);
...
Bạn cũng có thể tinh chỉnh các đối số ghim của OpenMP thời gian chạy. Đối với GCC/libgomp
ái lực được kiểm soát bởi biến môi trường GOMP_CPU_AFFINITY, trong khi đối với các trình biên dịch Intel là KMP_AFFINITY. Bạn vẫn có thể sử dụng mã ở trên nếu thời gian chạy OpenMP cắt giao diện sở thích được cung cấp với mặt nạ của quy trình.
Chỉ vì lợi ích của sự hoàn chỉnh - tiết kiệm, thiết lập và khôi phục mặt nạ ái lực trên 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);
...
nên làm việc với một nhóm bộ xử lý duy nhất (lên đến 64 bộ vi xử lý logic).
Tôi nghĩ điều này chỉ hoạt động. Bạn có chắc chắn ghim không được bật không? Kiểm tra cài đặt 'I_MPI_PIN'. –
Chắc chắn bạn đã bật quá trình ghim. Bí quyết là nếu bạn vô hiệu hóa nó, các quá trình MPI của bạn sẽ không còn bị ràng buộc cốt lõi và hiệu suất của phần MPI sẽ giảm. Bạn có thể thay đổi mặt nạ CPU theo chương trình - lưu nó, cho phép tất cả các bộ xử lý cho giai đoạn OpenMP, khôi phục mặt nạ. –