2012-06-04 44 views
12

Khi sử dụng MPI_Isend, thông số MPI_Request có phải là một con trỏ rỗng không (khi người gửi không quan tâm đến thông báo sau khi nó được gửi)?Tham số yêu cầu MPI_Isend

+1

Hãy dùng thử? Nên cho một segfault nếu nó không thể. – aztaroth

+0

Ok, tôi đã thử và câu trả lời là không: MPI kiểm tra con trỏ yêu cầu không phải là null và nếu không thì sẽ in ra một lỗi. – sunmat

Trả lời

23

Câu trả lời ngắn gọn là không - tham số xử lý yêu cầu không thể là NULL.

MPI_Isend() khởi tạo hoạt động gửi không đồng bộ. Tất cả các hoạt động không đồng bộ được đưa ra một tay cầm yêu cầu đó phải được hành động theo sau bằng một trong các cách sau:

  • khối và chờ cho các hoạt động để kết thúc với MPI_Wait() và bạn bè
  • kiểm tra các hoạt động để hoàn thành với MPI_Test() và bạn bè cho đến khi kiểm tra hóa ra dương
  • miễn phí xử lý với MPI_Request_free()

chờ đợi và thử nghiệm Cả hai chức năng giải phóng các yêu cầu khi nó đã hoàn thành. Bạn cũng có thể giải phóng nó ngay lập tức sau khi được trả lại bởi MPI_Isend(). Điều này sẽ không hủy bỏ hoạt động mà là đánh dấu yêu cầu xóa ngay sau khi nó kết thúc. Tuy nhiên, bạn sẽ không thể nhận trạng thái của thao tác gửi.

Nếu bạn không quan tâm đến kết quả của hoạt động không đồng bộ (ví dụ như tình trạng hoàn thành, thông điệp nhận được tình trạng, mã lỗi, vv), điều phải làm là như sau:

MPI_Request req; 
... 
MPI_Isend(..., &req); 
MPI_Request_free(&req); 
... 

Caveat : điều này làm việc cho các gửi không đồng bộ vì người ta có thể đưa ra một phương pháp khác để xác minh rằng hoạt động gửi đã hoàn thành, ví dụ: quá trình đích có thể phản hồi sau khi nhận được tin nhắn. Nhưng người ta không bao giờ nên miễn phí một yêu cầu nhận không đồng bộ và nên chờ đợi hoặc thử nghiệm để hoàn thành thay vì như vậy sẽ không có cách nào để biết khi nào hoạt động đã được hoàn thành.

+2

Điều này là chính xác. Tôi chỉ muốn thêm rằng có một lý do người ta phải hoàn thành một 'MPI_Request' theo một cách nào đó. Có thể thực hiện MPI để trì hoãn công việc thực tế của việc gửi tin nhắn cho đến khi cuộc gọi 'MPI_Wait' (hoặc tương đương). Nếu yêu cầu được bắt đầu và không bao giờ hoàn thành, có thể tin nhắn sẽ không bao giờ được gửi. –

+0

Cảm ơn! Tôi đã mở rộng từ "kết quả" để phản ánh tốt hơn những gì tôi đã có trong tâm trí. –

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