2010-02-13 26 views
5

Tôi cần phải MPI_Gatherv() một số cặp int/string. Giả sử mỗi cặp trông giống như sau:Chuyển các cấu trúc có chiều dài thay đổi giữa các quy trình MPI

struct Pair { 
    int x; 
    unsigned s_len; 
    char s[1]; // variable-length string of s_len chars 
}; 

Cách xác định kiểu dữ liệu MPI thích hợp cho ghép nối?

+0

Sử dụng 'char s [0];' cho mảng có độ dài biến, không phải 'char s [1];'. – kennytm

+0

@KennyTM, s [0] đưa ra "cảnh báo C4200: phần mở rộng không chuẩn được sử dụng: mảng có kích cỡ bằng không trong cấu trúc/liên kết". – Constantin

+0

Ah MSVC. C99 được hỗ trợ tốt bởi gcc, nhưng không được hỗ trợ bởi MSVC. – kennytm

Trả lời

4

Tóm lại, về mặt lý thuyết không thể gửi một thông điệp có kích thước thay đổi và nhận nó vào bộ đệm có kích thước hoàn hảo. Bạn sẽ phải gửi một tin nhắn đầu tiên với các kích thước của mỗi chuỗi và sau đó một thông điệp thứ hai với các chuỗi, hoặc mã hóa metainfo đó vào tải trọng và sử dụng bộ đệm nhận tĩnh.

Nếu bạn chỉ gửi một tin nhắn, sau đó tôi sẽ bỏ định nghĩa một kiểu dữ liệu cho Pair: thay vào đó, tôi sẽ tạo một datatype cho toàn bộ tải trọng và đổ tất cả dữ liệu vào một gói không liên tục. Sau đó, ở đầu nhận, bạn có thể lặp lại nó, phân bổ số lượng không gian chính xác cần thiết cho mỗi chuỗi và điền vào nó. Hãy để tôi roi lên một sơ đồ ASCII để minh họa. Đây sẽ là trọng tải của bạn:

| ..x1 .. | ..s_len1 .. | .... string1 .... | ..x2 .. | ..s_len2 .. | .string2. |. .x3 .. | ..s_len3 .. | ....... string3 ....... | ...

Bạn gửi toàn bộ nội dung dưới dạng một đơn vị (ví dụ: mảng MPI_BYTE), sau đó người nhận sẽ giải nén nó một cái gì đó như thế này:

while (buffer is not empty) 
{ 
    read x; 
    read s_len; 
    allocate s_len characters; 
    move s_len characters from buffer to allocated space; 
} 

Lưu ý tuy nhiên rằng giải pháp này chỉ hoạt động nếu biểu diễn dữ liệu số nguyên và ký tự là như nhau trên các hệ thống gửi và nhận.

+0

Đóng gói tất cả mọi thứ trong bộ đệm liền kề là những gì tôi cuối cùng đã giải quyết. Một điều cần lưu ý là tôi đã phải sử dụng thêm MPI_Gather() để thu thập kích thước tải trọng từ mỗi quá trình. Các kích thước tải trọng này được sử dụng để tính toán kích thước của bộ đệm recv và vector dịch chuyển (http://www.mpi-forum.org/docs/mpi-11-html/node70.html). – Constantin

2

Tôi không nghĩ bạn có thể làm những gì bạn muốn với MPI. Tôi là một lập trình viên của Fortran, vì vậy hãy chịu đựng tôi nếu sự hiểu biết của tôi về C là một chút run rẩy. Bạn muốn, có vẻ như, để vượt qua một cấu trúc dữ liệu bao gồm 1 int và 1 chuỗi (mà bạn vượt qua bằng cách đi qua vị trí của các ký tự đầu tiên trong chuỗi) từ một quá trình khác? Tôi nghĩ rằng những gì bạn sẽ phải làm là vượt qua một chuỗi dài cố định - mà sẽ có, do đó, để được miễn là bất kỳ chuỗi bạn thực sự muốn vượt qua. Khu vực tiếp tân cho việc thu thập các dây này sẽ phải đủ lớn để nhận được tất cả các chuỗi cùng với độ dài của chúng.

Có thể bạn sẽ muốn khai báo kiểu dữ liệu MPI mới cho cấu trúc của mình; sau đó bạn có thể thu thập chúng và, vì dữ liệu được thu thập bao gồm độ dài của chuỗi, khôi phục các phần hữu ích của chuỗi tại bộ thu.

Tôi không chắc chắn về điều này, nhưng tôi chưa bao giờ bắt gặp độ dài tin nhắn thực sự thay đổi như bạn có vẻ muốn sử dụng và nó có cảm giác không giống như MPI. Nhưng nó có thể là một cái gì đó thực hiện trong phiên bản mới nhất của MPI mà tôi đã không bao giờ vấp ngã trên, mặc dù nhìn vào các tài liệu trên mạng nó không có vẻ như vậy.

+0

Tôi hy vọng tránh lãng phí không gian với bộ đệm có độ dài cố định. Một lựa chọn khác có thể muốn tránh là đại diện cho mảng của cặp len/chars với 2 mảng riêng biệt: một trong các ống kính và một trong các ký tự. Dù sao cũng cảm ơn bạn. – Constantin

+0

Đánh dấu, nó đã được một thời gian kể từ khi tôi chơi với MPI, nhưng tôi khá chắc chắn rằng bạn đang chính xác ở đây. Ít nhất là vào khoảng năm 2005 MPI. –

1

Việc triển khai MPI không kiểm tra hoặc giải thích nội dung thực tế của thư. Miễn là bạn biết kích thước của cấu trúc dữ liệu, bạn có thể biểu diễn kích thước đó trong một số số char hoặc int. Việc thực hiện Bộ KH & ĐT sẽ không biết hoặc quan tâm đến các chi tiết nội bộ thực tế của dữ liệu.

Có một vài thông báo ... cả người gửi và người nhận cần đồng ý về cách diễn giải nội dung thư và bộ đệm bạn cung cấp trên mặt gửi và nhận cần phải khớp với số lượng có thể xác định của int.

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