2015-07-13 15 views
13

Tôi không chắc khi nào tôi phải sử dụng các số khác nhau cho trường thẻ trong MPI gửi, nhận cuộc gọi. Tôi đã đọc this, nhưng tôi không thể hiểu được.Khi nào sử dụng thẻ khi gửi và nhận tin nhắn trong MPI?

Đôi khi có những trường hợp khi A có thể phải gửi nhiều loại thư khác nhau đến B. Thay vì B phải đi qua thêm biện pháp để phân biệt tất cả các thông báo, Bộ KH & ĐT cho phép người gửi và người nhận đến cũng chỉ định ID tin nhắn có tin nhắn (được gọi là thẻ). Khi quá trình B chỉ yêu cầu một tin nhắn với một số thẻ nhất định, số , các tin nhắn có các thẻ khác nhau sẽ được đệm bởi mạng cho đến khi B sẵn sàng cho chúng.

Tôi có phải sử dụng thẻ, ví dụ: khi tôi có nhiều cuộc gọi "isend" (với các thẻ khác) từ quy trình A và chỉ 1 cuộc gọi đến "lừa đảo" trong quy trình B?

+1

Trong trường hợp này, bạn sử dụng 'MPI_TAG_ANY' ở phía bên nhận, hãy xem cấu trúc Trạng thái sau khi nhận để xác định thẻ nào đã được sử dụng và xử lý tương ứng. –

Trả lời

7

Thẻ thông báo là tùy chọn. Bạn có thể sử dụng các giá trị số nguyên tùy ý cho chúng và sử dụng bất kỳ ngữ nghĩa nào bạn thích và có vẻ hữu ích cho bạn.

Như bạn đã đề xuất, thẻ có thể được sử dụng để phân biệt giữa các thư có nhiều loại khác nhau (MPI_INTEGER, MPI_REAL, MPI_BYZE, v.v.). Bạn cũng có thể sử dụng thẻ để thêm một số thông tin về dữ liệu thực sự đại diện (nếu bạn có ma trận nxn, một thông điệp để gửi một hàng ma trận này sẽ bao gồm n giá trị, như một thông điệp để gửi một cột của ma trận đó; tuy nhiên, bạn có thể muốn xử lý dữ liệu hàng và cột khác nhau).

Lưu ý rằng thao tác nhận phải khớp với thẻ của thư mà nó muốn nhận. Tuy nhiên, điều này không có nghĩa là bạn phải chỉ định cùng một thẻ, bạn cũng có thể sử dụng thẻ hoang dã MPI_ANY_TAG làm thẻ thông báo; hoạt động nhận sẽ không khớp với các thẻ thông báo tùy ý. Bạn có thể tìm hiểu xem người gửi đã sử dụng thẻ nào với sự trợ giúp của MPI_Probe.

7

Nói chung, tôi có xu hướng tránh chúng. Không có yêu cầu bạn sử dụng thẻ. Nếu bạn cần nhận kích thước thư trước khi phân tích cú pháp thư, bạn có thể sử dụng MPI_Probe. Bằng cách đó, bạn có thể gửi các thông điệp khác nhau thay vì chỉ định Thẻ. Tôi thường sử dụng thẻ vì MPI_Recv yêu cầu bạn biết kích thước thư trước khi tìm nạp dữ liệu. Nếu bạn có các kích thước và loại khác nhau, thẻ có thể giúp bạn phân biệt giữa chúng bằng cách có nhiều luồng hoặc quá trình nghe qua một tập con khác. Thẻ 1 có thể có nghĩa là thông điệp của loại X và thẻ 2 sẽ là thông điệp của loại Y. Ngoài ra, nó cho phép bạn có nhiều "kênh" giao tiếp mà không cần phải thực hiện công việc tạo giao tiếp và nhóm duy nhất.

#include <mpi.h> 
#include <iostream> 

using namespace std; 

int main(int argc, char* argv[]) 
{ 
    // Init MPI 
    MPI_Init(&argc, &argv); 

    // Get the rank and size 
    int rank, size; 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 

    // If Master 
    if(rank == 0){ 

     char* message_r1 = "Hello Rank 1"; 
     char* message_r2 = "Hello Rank 2"; 

     // Send a message over tag 0 
     MPI_Send(message_r1, 13, MPI_CHAR, 1, 0, MPI_COMM_WORLD); 

     // Send a message over tag 1 
     MPI_Send(message_r2, 13, MPI_CHAR, 2, 1, MPI_COMM_WORLD); 


    } 
    else{ 

     // Buffer 
     char buffer[256]; 
     MPI_Status status; 

     // Wait for your own message 
     MPI_Recv(buffer, 13, MPI_CHAR, 0, rank-1, MPI_COMM_WORLD, &status); 

     cout << "Rank: " << rank << ", Message: " << buffer << std::endl; 

    } 

    // Finalize MPI 
    MPI_Finalize(); 

} 
+0

vì vậy nếu tôi phải gửi nhiều thư, theo thứ tự (1 gửi = 1 thư), từ tiến trình A đến tiến trình B thì không cần phải thay đổi thẻ, đúng không? – FrancescoN

+0

Vâng. Bạn chỉ cần các thẻ khác nhau nếu bạn có kế hoạch gửi các loại tin nhắn khác nhau. Nếu không, 0 là tốt. – msmith81886

+0

các loại khác nhau chỉ có nghĩa là MPI_INTEGER và MPI_REAL chẳng hạn, phải không? – FrancescoN

2

Thẻ có thể hữu ích trong tính toán phân tán các thuật toán trong đó có thể có nhiều loại thư. Hãy xem xét vấn đề bầu cử lãnh đạo, nơi mà một quá trình (ứng cử viên bầu cử) gửi một thông điệp loại requestVote và các quá trình khác đáp ứng với một thông điệp của loại voteGrant.

Có nhiều thuật toán như vậy phân biệt giữa các loại thư và thẻ có thể hữu ích khi phân loại trong số các thư đó.

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