2012-10-30 34 views
8

Tôi có một máy có 8 bộ xử lý. Tôi muốn luân phiên sử dụng OpenMP và Bộ KH & ĐT về mã của tôi như thế này:Chương trình lai OpenMP và MPI

OpenMP giai đoạn:

  • bậc 1-7 chờ đợi trên MPI_Barrier
  • rank 0 sử dụng tất cả 8 bộ vi xử lý với OpenMP

Bộ KH & ĐT giai đoạn:

  • rank 0 đến hàng rào và tất cả các cấp bậc sử dụng một bộ xử lý mỗi

Cho đến nay, tôi đã thực hiện:

  • bộ I_MPI_WAIT_MODE 1 để đứng thứ 1-7 không sử dụng CPU trong khi trên rào chắn.
  • đặt omp_set_num_threads (8) trên xếp hạng 0 để nó khởi chạy 8 chuỗi OpenMP.

Tất cả đều hoạt động. Xếp hạng 0 đã khởi chạy 8 luồng, nhưng tất cả chỉ được giới hạn trong một bộ xử lý. Trong giai đoạn OpenMP, tôi nhận được 8 chủ đề từ thứ hạng 0 chạy trên một bộ xử lý và tất cả các bộ vi xử lý khác không hoạt động.

Làm cách nào để yêu cầu MPI cho phép xếp hạng 0 để sử dụng các bộ xử lý khác? Tôi đang sử dụng Bộ xử lý Intel MPI, nhưng có thể chuyển sang OpenMPI hoặc MPICH nếu cần.

+1

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'. –

+1

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ạ. –

Trả lời

0

Cảm ơn tất cả các nhận xét và câu trả lời. Bạn ổn thôi. Đó là tất cả về tùy chọn "PIN".

Để giải quyết vấn đề của tôi, tôi chỉ phải:

I_MPI_WAIT_MODE = 1

I_MPI_PIN_DOMAIN = OMP

đơn giản như vậy. Bây giờ tất cả các bộ vi xử lý có sẵn cho tất cả các cấp bậc.

Tùy chọn

I_MPI_DEBUG = 4

chương trình mà bộ vi xử lý từng cấp bậc được.

+1

Việc bạn đã làm là vô hiệu hóa quá trình ghim quá trình - một quá trình được ghim vào tất cả các CPU có sẵn không được ghim. –

13

Đ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).

Các vấn đề liên quan