Người dùng cần những tính năng gì từ giao diện MPI C ++?


28

Phiên bản 3.0 của tiêu chuẩn MPI đã chính thức xóa giao diện C ++ (trước đây không dùng nữa). Mặc dù các triển khai vẫn có thể hỗ trợ nó, các tính năng mới trong MPI-3 không có giao diện C ++ được xác định trong tiêu chuẩn MPI. Xem http://bloss.cisco.com/performance/the-mpi-c-bindings-what-happened-and-why/ để biết thêm thông tin.

Động lực để loại bỏ giao diện C ++ khỏi MPI là nó không có giá trị đáng kể so với giao diện C. Có rất ít sự khác biệt ngoài "s / _ / :: / g" và nhiều tính năng mà người dùng C ++ quen thuộc không được sử dụng (ví dụ: xác định loại tự động thông qua các mẫu).

Là người tham gia Diễn đàn MPI và làm việc với một số dự án C ++ đã triển khai giao diện C ++ của riêng họ cho các chức năng MPI C, tôi muốn biết các tính năng mong muốn của giao diện C ++ đối với MPI là gì. Mặc dù tôi cam kết không có gì, tôi sẽ thấy thú vị khi thấy việc triển khai giao diện MPI C ++ độc lập đáp ứng nhu cầu của nhiều người dùng.

Và vâng, tôi quen thuộc với Boost :: MPI ( http://www.boost.org/doc/libs/1_54_0/doc/html/mpi.html ) nhưng nó chỉ hỗ trợ các tính năng MPI-1 và mô hình tuần tự hóa sẽ là cực kỳ khó hỗ trợ cho RMA.

Một giao diện C ++ cho MPI mà tôi thích là của Elemental ( https://github.com/poulson/Euityal/blob/master/src/core/imports/mpi.cpp ) để có lẽ mọi người có thể cung cấp một số pro và con wrt tiếp cận. Cụ thể, tôi nghĩ MpiMap giải quyết một vấn đề thiết yếu.


Tôi không nghĩ rằng đây là nơi thích hợp cho câu hỏi như vậy.
Jack Poulson

Bạn có thể đưa ra một số lý do cho điều đó? Nhiều câu hỏi của Bộ KH & ĐT trên trang web này gợi ý cho tôi rằng mọi người ở đây đã sẵn sàng trả lời câu hỏi này. Ngoài ra, 0,2 upvote mỗi phút cho thấy người khác không đồng ý với đánh giá của bạn. Trong mọi trường hợp, sẽ hữu ích hơn khi đề xuất một địa điểm khác để đăng bài này nếu bạn không thích địa điểm hiện tại.
Jeff

Câu hỏi là một câu hỏi có giá trị và tôi nghĩ rằng nó có thể nhận được một số câu trả lời có giá trị trong danh sách gửi thư khoa học tính toán rộng hơn, nếu nó nằm trong phạm vi đó. (Có thể NA-digest, SIAM-CSE hoặc thậm chí là một bài đăng công khai trên G +?) Câu hỏi này có thể không phù hợp với trang web Stack Exchange vì nó mang tính chủ quan (xem scicomp.stackexchange.com/help/dont-ask ) . Miễn là câu trả lời cụ thể và tập trung vào các trường hợp sử dụng cụ thể (không lặp lại hoặc chồng chéo đáng kể), tôi nghĩ rằng nó đáng để giữ mở.
Geoff Oxberry

@Jeff: Câu hỏi đi qua giống như một cuộc thăm dò ý kiến ​​đối với tôi. Tôi không tranh luận rằng nó có giá trị, nhưng tôi không thấy có một câu trả lời được chấp nhận. Một câu hỏi như vậy có phải là khác thường đối với diễn đàn MPI không?
Jack Poulson

@JackPoulson Tôi không muốn biết những gì người thực hiện nghĩ là câu trả lời đúng; Tôi muốn biết những gì các nhà khoa học tính toán cần. Về mặt này, câu hỏi có câu trả lời khách quan. Không có một câu trả lời đúng nhưng điều đó không có nghĩa đó là một tình huống chủ quan.
Jeff

Câu trả lời:


17

Trước tiên, hãy để tôi trả lời lý do tại sao tôi nghĩ các giao diện C ++ cho MPI thường không thành công quá mức, đã suy nghĩ về vấn đề này trong một thời gian dài khi cố gắng quyết định liệu chúng ta chỉ nên sử dụng các ràng buộc C tiêu chuẩn của MPI hay xây dựng ở mức độ cao hơn :

Khi bạn nhìn vào các mã MPI trong thế giới thực (giả sử, PETSc, hoặc trong trường hợp của tôi.II), người ta sẽ thấy rằng có thể đáng ngạc nhiên, số lượng cuộc gọi MPI thực sự không quá lớn. Ví dụ: trong 500k dòng deal.II, chỉ có ~ 100 MPI cuộc gọi. Hậu quả của điều này là nỗi đau liên quan đến việc sử dụng các giao diện cấp thấp hơn như các ràng buộc MPI C, không quá lớn. Ngược lại, người ta sẽ không đạt được nhiều như vậy bằng cách sử dụng các giao diện cấp cao hơn.

Quan sát thứ hai của tôi là nhiều hệ thống có nhiều thư viện MPI được cài đặt (triển khai MPI khác nhau hoặc các phiên bản khác nhau). Điều này đặt ra một khó khăn đáng kể nếu bạn muốn sử dụng, giả sử, boost :: mpi không chỉ bao gồm các tệp tiêu đề: hoặc cũng cần phải có nhiều cài đặt của gói này, hoặc người ta cần phải xây dựng nó như một phần của dự án sử dụng boost :: mpi (nhưng đó lại là một vấn đề, do việc boost đó sử dụng hệ thống xây dựng riêng của nó, không giống với bất kỳ điều gì khác).

Vì vậy, tôi nghĩ rằng tất cả những điều này đã âm mưu chống lại các giao diện C ++ hiện tại cho MPI: Các ràng buộc MPI C ++ cũ không cung cấp bất kỳ lợi thế nào và các gói bên ngoài gặp khó khăn với thế giới thực.

Tất cả đã nói, đây là những gì tôi nghĩ sẽ là các tính năng giết người mà tôi muốn có từ giao diện cấp cao hơn:

  • Nó nên chung chung. Phải xác định kiểu dữ liệu của một biến được quyết định không giống như C ++. Tất nhiên, nó cũng dẫn đến lỗi. Lớp MpiMap của Elemental sẽ là bước đầu tiên tốt đẹp (mặc dù tôi không thể hiểu tại sao MpiMap::typebiến số không phải là hằng tĩnh, để nó có thể được truy cập mà không cần tạo đối tượng).

  • Nó nên có phương tiện để truyền các loại dữ liệu tùy ý.

  • Các hoạt động yêu cầu một MPI_Opđối số (ví dụ: giảm) nên tích hợp độc đáo với std::functiongiao diện của C ++ , để dễ dàng vượt qua một con trỏ hàm (hoặc lambda!) Thay vì phải đăng ký một cách vụng về.

boost :: mpi thực sự thỏa mãn tất cả những điều này. Tôi nghĩ rằng nếu đó là một thư viện chỉ có tiêu đề, nó sẽ phổ biến hơn rất nhiều trong thực tế. Nó cũng sẽ hữu ích nếu nó hỗ trợ các chức năng sau MPI 1.0, nhưng hãy trung thực: điều này bao gồm hầu hết những gì chúng ta cần hầu hết thời gian.


Một trong những vấn đề với việc tuần tự hóa trong Boost :: MPI là nó không hoạt động với một phía (còn gọi là RMA). Bạn có nghĩ rằng sẽ có thể tạo các kiểu dữ liệu MPI cho các đối tượng C ++ mà người dùng quan tâm không? Tất nhiên, trên lý thuyết tất cả nên được hỗ trợ nhưng tôi thích bắt đầu với một mục tiêu thực dụng hơn.
Jeff

Tôi nghĩ thật sai lầm khi nghĩ rằng kiểu dữ liệu nối tiếp có thể hoạt động với truyền thông một phía. Điều này giả định rằng một tuần tự hóa chỉ liên quan đến việc đóng gói dữ liệu thành một chuỗi và mặt khác giải nén nó một lần nữa. Nhưng các chức năng tuần tự hóa có thể làm được nhiều hơn (ví dụ, theo dõi con trỏ đến các đối tượng khác, đếm byte đã được tuần tự hóa, v.v.) mà người ta có thể mong đợi hoạt động nếu bạn không thể thực hiện bất cứ điều gì trên máy chủ đích. Quan điểm của tôi là C ++ - xê-ri hóa kiểu giao tiếp và giao tiếp một phía chỉ đơn giản là không bắt đầu. Tôi nghĩ rằng không ai nên mong đợi điều này sẽ làm việc, vì vậy sẽ ít bị bỏ lỡ.
Wolfgang Bangerth 16/07/13

Xin chào Wolfgang, bạn đã đúng rằng MpiMap sẽ thanh lịch hơn nếu nó sử dụng biến thành viên const tĩnh. Tôi đã tổ chức lại việc thực hiện: github.com/poulson/Euityal/commit/ triệt
Jack Poulson

Vâng, đẹp hơn nhiều :-)
Wolfgang Bangerth 17/07/13

+1 về không nhiều cuộc gọi mpi @WolfgangBangerth. Về cơ bản, mpi được cho là làm cho việc tính toán nhanh hơn, bạn muốn giảm thiểu các cuộc gọi mpi vì chúng làm bạn tốn kém!
Charles

6

Để có được quả bóng lăn, đây là hai nhu cầu của tôi:

  • Giao diện sẽ có thể loại bỏ các đối số dư thừa hoặc không cần thiết, ví dụ MPI_IN_PLACE.
  • Giao diện sẽ tự động phát hiện các kiểu dữ liệu tích hợp ala Elemental's MpiMap.
  • Nếu / bất cứ khi nào có thể, các kiểu dữ liệu do người dùng định nghĩa nên được xây dựng cho các lớp.

5

Danh sách của tôi không theo thứ tự ưu tiên cụ thể. Giao diện nên:

  • chỉ là tiêu đề, không có bất kỳ phụ thuộc nào <mpi.h>, và, và thư viện chuẩn,
  • chung chung và mở rộng,
  • không chỉ chặn (nếu bạn muốn chặn, sau đó chặn rõ ràng, không theo mặc định),
  • cho phép tiếp tục dựa trên chuỗi các hoạt động không chặn,
  • hỗ trợ tuần tự hóa mở rộng và hiệu quả (Boost.Fusion như, như vậy nó hoạt động với RMA),
  • có hình phạt trừu tượng bằng không (tức là ít nhất là nhanh như giao diện C),
  • được an toàn (kẻ hủy diệt của một tương lai không sẵn sàng được gọi là? -> std :: chấm dứt!),
  • có một DEBUGchế độ mạnh mẽ với hàng tấn xác nhận,
  • cực kỳ an toàn (không còn ints / void * cho tất cả mọi thứ, tôi muốn các thẻ là loại!),
  • nó nên hoạt động với lambdas (ví dụ: tất cả giảm + lambda),
  • sử dụng ngoại lệ một cách nhất quán làm cơ chế báo cáo lỗi và xử lý lỗi (không còn mã lỗi nữa! không có thêm đối số đầu ra chức năng!),
  • MPI-IO nên cung cấp giao diện I / O không chặn theo kiểu Boost.AFIO,
  • và chỉ cần tuân theo các thực tiễn thiết kế giao diện C ++ hiện đại tốt (xác định các loại thông thường, các chức năng không phải là thành viên không phải là thành viên, chơi tốt với ngữ nghĩa di chuyển, hoạt động phạm vi hỗ trợ, ...)

Ngoài ra:

  • cho phép tôi chọn người thực thi môi trường MPI, nghĩa là nó sử dụng nhóm luồng nào. Ngay bây giờ bạn có thể có các ứng dụng với hỗn hợp OpenMP, MPI, CUDA và TBB ... cùng một lúc, trong đó mỗi lần chạy đều nghĩ rằng nó sở hữu môi trường và do đó yêu cầu hệ điều hành cho các luồng mỗi khi họ cảm thấy nó Nghiêm túc?

  • sử dụng quy ước đặt tên STL (và Boost). Tại sao? Mọi lập trình viên C ++ đều biết điều đó.

Tôi muốn viết mã như thế này:

auto buffer = some_t{no_ranks};
auto future = gather(comm, root(comm), my_offsets, buffer)
              .then([&](){
                /* when the gather is finished, this lambda will 
                   execute at the root node, and perform an expensive operation
                   there asynchronously (compute data required for load 
                   redistribution) whose result is broadcasted to the rest 
                   of the communicator */
                return broadcast(comm, root(comm), buffer);
              }).then([&]() {
                /* when broadcast is finished, this lambda executes 
                   on all processes in the communicator, performing an expensive
                   operation asynchronously (redistribute the load, 
                   maybe using non-blocking point-to-point communication) */
                 return do_something_with(buffer);
              }).then([&](auto result) {
                 /* finally perform a reduction on the result to check
                    everything went fine */
                 return all_reduce(comm, root(comm), result, 
                                  [](auto acc, auto v) { return acc && v; }); 
              }).then([&](auto result) {
                  /* check the result at every process */
                  if (result) { return; /* we are done */ }
                  else {
                    root_only([](){ write_some_error_log(); });
                    throw some_exception;
                  }
              });

/* Here nothing has happened yet! */

/* ... lots and lots of unrelated code that can execute concurrently 
   and overlaps with communication ... */

/* When we now call future.get() we will block 
   on the whole chain (which might have finished by then!).
*/

future.get();

Hãy nghĩ làm thế nào người ta có thể xâu chuỗi tất cả các hoạt động này bằng cách sử dụng MPI_C request. Bạn sẽ phải kiểm tra ở nhiều bước (hoặc mỗi bước) trung gian thông qua rất nhiều mã không liên quan để xem liệu bạn có thể tiến chuỗi của mình mà không bị chặn hay không .


Đây là một danh sách các yêu cầu khốc liệt. Một vài trong số đó là không thể cho tất cả các mục đích thực tế (ví dụ như hỗ trợ giảm bớt lambdas). Tuy nhiên, nhìn chung tôi nghĩ đó là loại điều mà cộng đồng MPI nên mong muốn hỗ trợ.
Jeff

Đối với các luồng và môi trường thời gian chạy, MPI sử dụng không có luồng hoặc luồng OS (POSIX, Windows hoặc Solaris, tùy thuộc vào HĐH) trong nội bộ. Tôi không chắc là tôi hiểu yêu cầu ở đây.
Jeff

Vấn đề là MPI có thể tùy ý yêu cầu các luồng từ hệ điều hành. Ứng dụng của tôi có một nhóm luồng và tôi muốn MPI yêu cầu các luồng đó từ nhóm luồng của tôi. Điều này hiện không thể thực hiện được (và thường không phải là vấn đề), trừ khi bạn có một ứng dụng sử dụng OpenMP, TBB và MPI, mỗi ứng dụng có nhóm luồng riêng, mỗi lõi có số lõi gấp 4 lần.
gnzlbg

1
MPI có thể nhưng thường không sử dụng các luồng hệ điều hành trong nội bộ. Trong mọi trường hợp mà tôi quen thuộc (MPICH (2), MVAPICH2, OpenMPI, CrayMPI), chỉ có một tùy chọn thời gian chạy được cung cấp bởi người dùng khiến điều này xảy ra, tức là mặc định là không. Blue Gene / Q MPI là một ngoại lệ nhưng ở dạng không liên quan đến cuộc thảo luận này.
Jeff

Cảm ơn @Jeff! Bạn có thể giải thích về cách MPI xử lý nhiều cuộc gọi không chặn trong khi sử dụng một chuỗi không? Nó có sử dụng coroutines / chủ đề xanh / sợi không?
gnzlbg

2

Cá nhân, tôi không thực sự bận tâm khi gọi các hàm kiểu C dài vì lý do chính xác mà Wolfgang đề cập; thực sự có rất ít nơi bạn cần gọi cho họ và thậm chí sau đó, họ hầu như luôn bị bao bọc bởi một số mã cấp cao hơn.

Điều duy nhất thực sự làm tôi bận tâm với MPI kiểu C là các kiểu dữ liệu tùy chỉnh và ở mức độ thấp hơn, các thao tác tùy chỉnh (vì tôi sử dụng chúng ít thường xuyên hơn). Đối với các kiểu dữ liệu tùy chỉnh, tôi muốn nói rằng một giao diện C ++ tốt sẽ có thể hỗ trợ cách xử lý chung và hiệu quả này, rất có thể thông qua việc tuần tự hóa. Tất nhiên đây là con đường boost.mpiđã đi, mà nếu bạn cẩn thận , là một tiết kiệm thời gian lớn.

Đối với boost.mpiviệc có thêm các phụ thuộc (đặc biệt là boost.serializationbản thân nó không phải là tiêu đề), gần đây tôi đã bắt gặp một thư viện tuần tự hóa C ++ chỉ có tiêu đề gọi là ngũ cốc có vẻ đầy hứa hẹn; cấp nó yêu cầu một trình biên dịch tuân thủ C ++ 11. Nó có thể đáng để xem xét và sử dụng nó như là một cơ sở cho một cái gì đó tương tự boost.mpi.


Lưu ý rằng tôi không nhất thiết phải tìm kiếm thứ gì đó để đưa vào tiêu chuẩn MPI. Tôi hoàn toàn đồng ý rằng Bộ KH & ĐT gần như luôn luôn "được bao bọc bởi một số mã cấp cao hơn", vì vậy điều tôi tự hỏi là, mã cấp cao hơn đó trông như thế nào? Elemental có một cách tiếp cận tốt đẹp, nhưng nó có phải là tốt nhất cho mọi trường hợp? Nếu ai đó muốn có một giao diện C ++ cho MPI mà cố gắng làm cho một số lượng lớn người hài lòng, thì nó sẽ trông như thế nào?
Jeff

@Jeff. Đối với tôi: 1. Tôi thích có thể gửi các loại dữ liệu tùy chỉnh một cách dễ dàng. 2. Tôi muốn có thể thực hiện giảm với các thao tác tùy chỉnh một cách dễ dàng. Ngoài ra tôi nghĩ 1 i lắc lư quan trọng / hữu ích hơn 2
GradGuy

Tôi không thấy C ++ làm bất cứ điều gì kỳ diệu (2). Bạn tưởng tượng gì ở đây?
Jeff

@Jeff Tôi đã suy nghĩ điều gì đó dọc theo cách thrustgiảm bớt: docs.thrust.googlecode.com/hg/group__reductions.html
GradGuy

-1

Dự án github easyLambda cung cấp giao diện cấp cao cho MPI với C ++ 14.

Tôi nghĩ rằng dự án có các mục tiêu tương tự và nó sẽ đưa ra một số ý tưởng về những điều có thể và đang được thực hiện trong lĩnh vực này bằng cách sử dụng C ++ hiện đại. Hướng dẫn những nỗ lực khác cũng như easyLambda.

Các điểm chuẩn ban đầu về hiệu suất và dòng mã đã cho thấy kết quả đầy hứa hẹn.

nhập mô tả hình ảnh ở đây

Sau đây là một mô tả ngắn về các tính năng và giao diện mà nó cung cấp.

Giao diện dựa trên lập trình luồng dữ liệu và các hoạt động danh sách chức năng cung cấp tính song song vốn có. Sự song song được thể hiện như tài sản của một nhiệm vụ. Việc phân bổ quy trình và phân phối dữ liệu cho tác vụ có thể được yêu cầu với thuộc tính .prll (). Có rất nhiều ví dụ trong trang webkho lưu trữ mã bao gồm xử lý bài động lực học phân tử LAMMPS, giải pháp sai phân hữu hạn rõ ràng cho phương trình nhiệt, hồi quy logistic, v.v. Ví dụ như vấn đề khuếch tán nhiệt được thảo luận trong bài viết HPC đang chết ... có thể được thể hiện trong ~ 20 dòng mã.

Tôi hy vọng sẽ tốt hơn khi cung cấp các liên kết thay vì thêm chi tiết và mã ví dụ ở đây.

Disclamer: Tôi là tác giả của thư viện. Tôi tin rằng tôi không làm hại gì khi hy vọng nhận được phản hồi mang tính xây dựng trên giao diện hiện tại của easyLambda có thể có lợi cho easyLambda và bất kỳ dự án nào khác theo đuổi các mục tiêu tương tự.


Câu hỏi cho biết " Chúng tôi đang tìm kiếm câu trả lời dài cung cấp một số giải thích và ngữ cảnh. Đừng chỉ đưa ra câu trả lời một dòng; giải thích lý do tại sao câu trả lời của bạn là đúng, lý tưởng với trích dẫn. Câu trả lời không bao gồm giải thích có thể bị xóa . ". Tại sao bạn nghĩ rằng câu trả lời của bạn là đủ để phù hợp với mô tả này?
nicoguaro

Tôi đang hướng tới một dự án cung cấp giao diện tương tự như những gì OP đang yêu cầu. Tôi có thể cung cấp chi tiết về động lực và tính năng của dự án trong câu trả lời và để OP và những người khác đọc và đề xuất những gì họ nghĩ về nó. Tuy nhiên, tôi chọn chỉ cung cấp liên kết. Tôi nhận được quan điểm của bạn. Hãy để tôi thêm một số văn bản với các tài liệu tham khảo cho câu trả lời.
Utkarsh Bhardwaj

@UtkarshBhardwaj: Một số ý kiến: (1) Cảm ơn bạn đã viết thư viện có giao diện C ++ với MPI. Đó là một công việc quan trọng và có vẻ như bạn đã đặt rất nhiều công việc vào đó. (2) Nhanh chóng lướt qua các tài liệu (một lần nữa, công việc tốt), điều nổi bật là các chuỗi lệnh phương thức dài được sử dụng, có vẻ như ... rất khó để gỡ lỗi, mặc dù bạn đã định dạng chúng một cách độc đáo. (3) Các tóm tắt giả định một mô hình chức năng, có vẻ hữu ích cho các tác vụ giống như bản đồ, nhưng là một người lập trình MPI, tôi không muốn làm lại các thuật toán của mình và di chuyển quá nhiều khỏi các giao diện mà tôi biết.
Geoff Oxberry

(4) Tôi không thấy các nhà giao tiếp ở bất cứ đâu trong ví dụ, điều này khiến tôi nghi ngờ bạn đang sử dụng MPI_COMM_WORLD cho mọi thứ và hạn chế tiềm năng của thư viện của bạn. (5) Các tóm tắt dường như được xây dựng dựa trên các trừu tượng MPI và có thể có một phụ trợ khác. (6) Dựa trên (3) - (5), tôi không nghĩ thư viện này là giao diện MPI và tôi tin rằng nhận xét này không đúng chủ đề.
Geoff Oxberry

@Geoff cảm ơn các phản hồi có giá trị, đánh giá cao. Trả lời các điểm cụ thể: 2) Chuỗi đôi khi được gọi là ExpressionBuilder . Đó là một cách phổ biến để thể hiện thành phần trong phong cách chức năng. Không cần thiết phải viết theo phong cách này trong ezl. Có thể viết các đơn vị riêng lẻ trước & sau đó soạn chúng, kiểm tra [ví dụ] ( goo.gl/YzaL0k ). 3) Tôi biết rất khó để chuyển từ luồng điều khiển & mệnh lệnh sang dataflow & chức năng. Mỗi cái đều có ưu và nhược điểm. Tuy nhiên, tôi tin rằng cái sau cần được khám phá nhiều hơn để biết hiệu quả thực sự của nó.
Utkarsh Bhardwaj
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.