2012-07-04 32 views
23

Cho phép nói rằng có một máy tính có 4 CPU mỗi lõi có 2 lõi, vì vậy hoàn toàn là 8 lõi. Với sự hiểu biết hạn chế của tôi, tôi nghĩ rằng tất cả các bộ xử lý chia sẻ cùng một bộ nhớ trong trường hợp này. Bây giờ, nó là tốt hơn để trực tiếp sử dụng OpenMP hoặc sử dụng MPI để làm cho nó chung để mã có thể làm việc trên cả hai thiết lập phân phối và chia sẻ. Ngoài ra, nếu tôi sử dụng MPI cho một thiết lập chia sẻ sẽ giảm hiệu suất so với openMP?MPI vs openMP cho bộ nhớ dùng chung

+1

Điều gì là tốt hơn tùy thuộc vào kế hoạch tương lai của bạn cho chương trình. Mặc dù vậy, OpenMP đơn giản hơn rất nhiều. –

+0

Như đã diễn đạt, câu hỏi này không mang tính xây dựng; 'tốt hơn' là quá chủ quan cho điều này để có được, theo tiêu chuẩn của SO, câu trả lời tốt. –

Trả lời

27

Với hầu hết các nền tảng bộ nhớ phân tán hiện nay bao gồm các nút SMP hoặc NUMA, điều đó không có ý nghĩa gì khi không sử dụng OpenMP. OpenMP MPI hoàn toàn có thể hoạt động cùng nhau; OpenMP cung cấp các lõi trên mỗi nút và MPI giao tiếp giữa các nút. Đây được gọi là lập trình lai. Nó được coi là kỳ lạ 10 năm trước nhưng bây giờ nó đang trở thành chủ đạo trong máy tính hiệu suất cao.

Đối với câu hỏi, câu trả lời đúng, với thông tin được cung cấp, luôn là một và giống nhau: CNTT PHỤ LỤC.

4

Để sử dụng trên một máy bộ nhớ dùng chung như vậy, tôi khuyên bạn nên sử dụng OpenMP. Nó làm cho một số khía cạnh của vấn đề đơn giản hơn và có thể sẽ nhanh hơn.

Nếu bạn có kế hoạch chuyển sang máy bộ nhớ phân tán, hãy sử dụng MPI. Nó sẽ giúp bạn giải quyết cùng một vấn đề hai lần. Lý do tôi nói OpenMP có thể nhanh hơn là vì việc thực hiện tốt MPI có thể đủ thông minh để phát hiện ra rằng nó được sử dụng trong môi trường bộ nhớ dùng chung và tối ưu hóa hành vi của nó cho phù hợp.

3

Chỉ cần cho một bức tranh lớn hơn, lập trình lai đã trở nên phổ biến vì lợi ích OpenMP từ cấu trúc liên kết bộ nhớ cache, bằng cách sử dụng cùng một không gian địa chỉ. Vì MPI có thể có cùng một dữ liệu được sao chép trên bộ nhớ (vì quá trình không thể chia sẻ dữ liệu) nên nó có thể bị hủy bộ nhớ cache.

Mặt khác, nếu bạn phân vùng dữ liệu của mình một cách chính xác và mỗi bộ xử lý có bộ đệm riêng, có thể vấn đề của bạn sẽ hoàn toàn phù hợp với bộ nhớ cache. Trong trường hợp này bạn có tốc độ siêu tuyến tính.

Bằng cách nói chuyện trong bộ nhớ cache, có cấu trúc liên kết bộ nhớ cache rất khác nhau trên bộ vi xử lý gần đây, và có luôn: TÙY THUỘC CNTT ...

48

Cho dù bạn cần hoặc muốn MPI hoặc OpenMP (hoặc cả hai) phụ thuộc rất nhiều loại của ứng dụng bạn đang chạy và liệu sự cố của bạn có chủ yếu là bộ nhớ bị ràng buộc hoặc CPU bị ràng buộc (hoặc cả hai). Hơn nữa, nó phụ thuộc vào loại phần cứng bạn đang chạy. Một vài ví dụ:

Ví dụ 1

Bạn cần song song bởi vì bạn đang chạy ra khỏi bộ nhớ, ví dụ bạn có một mô phỏng và kích thước vấn đề quá lớn đến nỗi dữ liệu của bạn không vừa với bộ nhớ của một nút đơn nữa. Tuy nhiên, các thao tác bạn thực hiện trên dữ liệu khá nhanh, vì vậy bạn không cần thêm công suất tính toán.

Trong trường hợp này, bạn có thể muốn sử dụng MPI và bắt đầu một quá trình MPI trên mỗi nút, do đó sử dụng tối đa bộ nhớ sẵn có trong khi giới hạn giao tiếp ở mức tối thiểu.

Ví dụ 2

Bạn thường có tập dữ liệu nhỏ và chỉ muốn tăng tốc độ ứng dụng của bạn, đó là tính toán nặng. Ngoài ra, bạn không muốn dành nhiều thời gian suy nghĩ về song song, nhưng nhiều thuật toán của bạn nói chung.

Trong trường hợp này, OpenMP là lựa chọn đầu tiên của bạn. Bạn chỉ cần thêm một vài câu lệnh ở đây và ở đó (ví dụ như trước các vòng lặp mà bạn muốn tăng tốc) và nếu chương trình của bạn không quá phức tạp, OpenMP sẽ tự động thực hiện phần còn lại cho bạn.

Ví dụ 3

Bạn muốn tất cả. Bạn cần nhiều bộ nhớ hơn, tức là nhiều nút tính toán hơn, nhưng bạn cũng muốn tăng tốc độ tính toán của mình càng nhiều càng tốt, tức là chạy trên nhiều lõi mỗi nút.

Giờ phần cứng của bạn được phát. Từ kinh nghiệm cá nhân của tôi, nếu bạn chỉ có một vài lõi trên mỗi nút (4-8), hình phạt hiệu suất được tạo ra bởi chi phí chung của việc sử dụng OpenMP (tức là bắt đầu các chủ đề OpenMP, vv) cao hơn chi phí của bộ xử lý nội bộ Giao tiếp MPI (tức là gửi thông điệp MPI giữa các quá trình thực sự chia sẻ bộ nhớ và sẽ không cần MPI để giao tiếp).
Tuy nhiên, nếu bạn đang làm việc trên máy có nhiều lõi hơn trên mỗi nút (16+), sẽ cần sử dụng phương pháp lai lai, tức là song song với MPI và OpenMP cùng một lúc. Trong trường hợp này, song song lai sẽ là cần thiết để tận dụng tối đa tài nguyên tính toán của bạn, nhưng nó cũng là khó khăn nhất để mã hóa và duy trì.

Tóm tắt
Nếu bạn gặp sự cố đủ nhỏ để chỉ chạy trên một nút, hãy sử dụng OpenMP. Nếu bạn biết rằng bạn cần nhiều hơn một nút (và do đó chắc chắn cần MPI), nhưng bạn ưu tiên khả năng đọc/nỗ lực mã trên hiệu suất, chỉ sử dụng MPI. Nếu sử dụng MPI chỉ không cung cấp cho bạn tốc độ bạn muốn/yêu cầu, bạn phải làm tất cả và đi lai.

Câu hỏi thứ hai (trong trường hợp không rõ ràng):
Nếu bạn thiết lập sao cho bạn không cần MPI (vì bạn sẽ chỉ chạy trên một nút), hãy sử dụng OpenMP Nhanh hơn. Nhưng nếu bạn biết rằng bạn cần MPI anyways, tôi sẽ bắt đầu với điều đó và chỉ thêm OpenMP sau, khi bạn biết rằng bạn đã cạn kiệt tất cả các tùy chọn tối ưu hóa hợp lý cho MPI.

+1

@ Michael Schmottke: Thưa Michael, bạn có thể giải thích cho tôi tại sao giải pháp lai sẽ nhanh hơn MPI chỉ dành cho trường hợp sử dụng với hai hoặc nhiều nút, mỗi nút có hơn 16 CPU? Những hạn chế của việc sử dụng chỉ MPI trong trường hợp này là gì? Cảm ơn rất nhiều –

+3

@neil_mccauley Từ kinh nghiệm cá nhân (và xem các ví dụ từ các nhóm nghiên cứu khác), hầu hết các mã khoa học đều sử dụng phương pháp lai khi cố gắng tận dụng đầy đủ các nút nhiều lõi. Đặc biệt là với sự hỗ trợ cho các chủ đề phần cứng, nó có vẻ hợp lý khi sử dụng song song cấp thread đến một mức độ nhất định trong một nút (hoặc thậm chí là lõi). Có số lượng MPI cực cao làm tăng khả năng giao tiếp, làm cho các hoạt động tập thể tốn kém hơn và (đáng kể nhất là) làm tăng mức tiêu thụ bộ nhớ.Cho dù nó có ý nghĩa trong trường hợp của bạn, chỉ có thể được trả lời trên cơ sở mỗi mã trên mỗi máy. –

+0

@MichaelSchlottke Tôi có một chương trình thực hiện nhiều tác vụ tính toán độc lập. Tôi đã thực hiện song song mức vòng lặp OpenMP trong mỗi tác vụ. Tuy nhiên, tốc độ là hư không gần lý thuyết và phụ thuộc rất nhiều vào chiều dài của vòng lặp. Bộ nhớ không phải là một hạn chế đối với tôi. Trong mã của tôi, thông tin liên lạc chỉ cần thiết khi công việc được hoàn thành, mất vài phút để hoàn thành. Bạn có nghĩ rằng một giải pháp chỉ MPI (phân phối các nhiệm vụ giữa các lõi nút) sẽ hiệu quả hơn nhiều so với cách tiếp cận lai cho trường hợp sử dụng của tôi? Cảm ơn rất nhiều! –

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