2012-08-14 59 views
7

Tôi có một ổ cắm kép Xeon E5522 2.26GHZ máy (có tính năng siêu phân luồng bị vô hiệu hoá) đang chạy máy chủ ubuntu trên hạt nhân Linux 3.0 hỗ trợ NUMA. Bố trí kiến ​​trúc là 4 lõi vật lý trên mỗi socket. ứng dụng Một OpenMP chạy trong máy này và tôi có các câu hỏi sau:Mối quan hệ OpenMP và NUMA?

  1. Có một chương trình OpenMP tận dụng (ví dụ: một sợi và dữ liệu cá nhân của mình được lưu giữ trên một nút NUMA cùng thực hiện) tự động khi chạy trên một máy NUMA + hạt nhân nhận thức ?. Nếu không, những gì có thể được thực hiện?

  2. còn NUMA và mỗi luồng cấu trúc dữ liệu C++ STL riêng tư thì sao?

+0

Vui lòng xác định loại lợi thế nào bạn có ý nghĩa trong "lợi thế khi chạy trên máy NUMA". OpenMP hiện không phải là ý thức của NUMA, nhưng OpenMP 4.0 có khả năng sẽ mang lại các quy định cho các chủ đề được cải thiện ràng buộc. –

+0

tôi đã cập nhật câu hỏi, chủ yếu là những gì bạn đã chỉ ra. Còn về 'taskset' thì sao? nó sẽ giúp đỡ để ràng buộc các chủ đề để dữ liệu cá nhân cho mỗi chủ đề được giữ địa phương? – labotsirc

Trả lời

15

Chuẩn OpenMP hiện tại xác định biến môi trường boolean OMP_PROC_BIND kiểm soát ràng buộc của chuỗi OpenMP. Nếu được đặt thành true, ví dụ:

shell$ OMP_PROC_BIND=true OMP_NUM_THREADS=12 ./app.x 

thì môi trường thực thi OpenMP không được di chuyển chủ đề giữa các bộ xử lý. Thật không may là không có gì nhiều hơn nói về cách những chủ đề nên được ràng buộc và đó là những gì một nhóm làm việc đặc biệt trong ngôn ngữ OpenMP comittee là giải quyết ngay bây giờ. OpenMP 4.0 sẽ đi kèm với các biến và các tham số mới cho phép người ta xác định cách phân phối các luồng. Tất nhiên, nhiều triển khai OpenMP cung cấp non-standard methods to control binding riêng của họ.

Phần lớn thời gian chạy OpenMP không phải là NUMA. Họ sẽ vui vẻ gửi chủ đề đến bất kỳ CPU có sẵn và bạn sẽ phải đảm bảo rằng mỗi thread chỉ truy cập dữ liệu thuộc về nó. Có một số gợi ý chung theo hướng này:

  • Không sử dụng dynamic lập kế hoạch cho song song for (C/C++)/DO (Fortran) vòng.
  • Cố gắng khởi tạo dữ liệu trong cùng một chuỗi mà sau này sẽ sử dụng nó. Nếu bạn chạy hai vòng lặp song song for tách rời với cùng kích thước nhóm và cùng số lượng các đoạn lặp, với đoạn lịch0 của cả hai vòng lặp sẽ được thực thi theo chuỗi 0, đoạn 1 - theo chuỗi 1, v.v.
  • Nếu sử dụng tác vụ OpenMP, hãy thử khởi tạo dữ liệu trong phần nhiệm vụ, vì hầu hết thời gian chạy OpenMP thực hiện nhiệm vụ ăn cắp - chuỗi nhàn rỗi có thể lấy cắp nhiệm vụ từ hàng đợi nhiệm vụ của chủ đề khác.
  • Sử dụng trình phân bổ bộ nhớ nhận thức NUMA.

Một số đồng nghiệp của tôi đã đánh giá kỹ NUMA hành vi của các giai đoạn OpenMP khác nhau và đã xem xét cụ thể ý thức của NUMA về việc triển khai của Intel, nhưng bài viết chưa được xuất bản nên tôi không thể cung cấp cho bạn liên kết.

Có một dự án nghiên cứu, được gọi là ForestGOMP, nhằm mục đích cung cấp thay thế thả xuống nhận thức NUMA cho libgomp. Có thể bạn nên cho nó một cái nhìn.

+0

mẹo rất hữu ích, cảm ơn.Đối với mẹo cuối cùng của bạn được chia thành từng nhóm; những gì xảy ra với trường hợp của đối tượng "m = new object (arg);" đối tượng phân bổ trong C + +, là có một tương đương như tcmalloc cho C? – labotsirc

+0

'tcmalloc' hỗ trợ cả C và C++. Đối với toán tử C++ 'new', bạn có thể sử dụng cú pháp vị trí để đưa đối tượng vào bộ nhớ, trước đó được phân bổ bởi' tcmalloc' hoặc dựa vào 'tcmalloc' thay thế cuộc gọi' malloc() 'chuẩn bằng cách tải trước (như' mới 'về mặt kỹ thuật là một trình bao bọc xung quanh' malloc'). –

+0

cảm ơn Hristo, tcmalloc pre-loading + taskset đang giúp mở rộng ứng dụng trong cùng socket, tuy nhiên khi tôi bắt đầu sử dụng lõi bổ sung từ socket thứ hai (không có taskset, cho phép openMP và OS xử lý thread binding) tăng tốc không cải thiện hoặc thậm chí có thể tệ hơn việc sử dụng một ổ cắm. Theo chu kỳ này tôi có thể (1) chờ phiên bản 4.0 hoặc (2) thả OpenMP và sử dụng ptrheads nhưng im không chắc chắn nếu tùy chọn thứ hai này sẽ thực sự cho tôi giải quyết vấn đề nhận thức NUMA, tôi phải điều tra rằng – labotsirc

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