Giao tiếp non-blocking

Một phần của tài liệu Nghiên cứu tính toán lưới và thử nghiệm một số thuật toán lý thuyết đồ thị (Trang 96 - 101)

Hình 4-9 : Giao tiếp non-blocking

Phân loại theo các hình thức truyền thơng thì non-blocking cũng cĩ một số thủ tục tương tự như các thủ tục blocking và cĩ thêm các tham số trong thủ tục như sau nhằm để quản lý các tiến trình gửi

Request object : Kiểu dữ liệu MPI_Request Ý nghĩa :

Nonblocking communication sử dụng đối tượng request để yêu cầu đối tượng nhận diện những họat động truyền thơng và liên kết với những thao tác xem xét sự hồn thành của tác vụ. Đối tượng request được định rõ vị trí trong bộ nhớ hệ thống MPI. Người dùng khơng biết đến cấu trúc của những đối tượng này. Chương trình ứng dụng chỉ vận dụng thẻ điều khiển (handle) đối tượng. Hệ thống cĩ thể dùng đối tượng request này để xác định một số thuộc tính khác của những thao tác truyền thơng, chẳng hạn như bộđệm truyền thơng liên quan đến nĩ, hay để lưu trữ thơng tin về những về trạng thái chưa được giải quyết của các họat động truyền thơng (gửi, nhận).

Tương tự các Blocking Send hay Receive của blocking communication, nhưng tên hàm cịn cĩ thêm chữ “I” phía trước.

MPI_Isend(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request)

MPI_Issend (void *buf,int count,MPI_Datatype datatype,int dest,int tag,MPI_Comm comm,MPI_Request *request)

Giống như MPI_Isend(), ngoại trừ hàm MPI_Wait() hoặc MPI_Test chỉ ra rằng khi nào thì xử lý đích đã nhận được thơng điệp.

MPI_Ibsend (void *buf,int count,MPI_Datatype datatype,int dest,int tag,MPI_Comm comm,MPI_Request *request)

Giống như MPI_Bsend() ngoại trừ MPI_Wait() hay MPI_Test chỉ ra rằng xử lý đích đã nhận được thơng điệp hay chưa. Hàm này phải được sử dụng với hàm MPI_Buffer_attach.

MPI_Irsend(void *buf,int count,MPI_Datatype datatype,int dest, int tag,MPI_Comm comm,MPI_Request *request)

Giống như MPI_Rsend() ngoại trừ MPI_Wait() hay MPI_Test() chỉ ra rằng khi nào thì xử lý chính nhận thơng điệp. Chỉ nên sử dụng nếu lập trình viên chắc chắn rằng cĩ một trình nhận thơng điệp thích hợp ở xử lý đích đã được đưa lên.

4.3.3.2. Non-Blocking Receive

MPI_Irecv(void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request)

thêm vào đối tượng cĩ kiểu dữ liệu MPI_Request dùng để trả về thẻđiều khiển. Và thẻ này dùng trong các trường hợp chờ trạng thái hồn thành của các Posting Operations, quản lý tiến trình nhận và gửi thơng điệp.

trả về của hệ thống thực thi gửi thơng điệp, tương tự truy xuất cho thao tác nhận.

4.3.3.3. Kiểm tra sự hồn thành của các tiến trình nhận

Bởi vì các hàm trong Posting Operation khơng được biết trước sự hồn thành khi được khởi chạy. Nên MPI cung cấp chức năng chờ cho đến khi thao tác Send và Receive đã hồn thành. Nếu thao tác non blocking Send và Receive cĩ thêm các thao tác chờ sự hồn thành thì giống như hàm blocking. Cĩ thể hình dung như thế này

MPI_Isend()+MPI_Wait() = = MPI_Send() MPI_Irecv()+MPI_Wait() = = MPI_Recv()

Phân loi kiu kim s hồn thành trong truyn thơng

Blocking

Kiểm tra sự hồn thành của các tiến trình gửi hoặc nhận và dùng lại các thơng tin liên quan đến các đối tượng này, chủ yếu là vùng nhớ ứng dụng dùng để gửi dữ liệu.Các hàm do MPI cung cấp cĩ tên Wait.

Non-blocking :

Chỉ kiểm tra xem đã hồn thành 1 tác vụ hay chưa, hàm này trả về ngay tại thời điểm đĩ. Và nếu tác vụđã hồn thành thì trả về thêm các thơng tin liên quan đến sự hồn thành đĩ, ngược lại trả về một giá trị khơng định nghĩa. Các hàm này mang tên Test

MPI_Wait(MPI_Request *request,MPI_Status *status)

Chờ cho đến khi tiến trình nhận thơng điệp nhận được thơng điệp hồn tồn, thơng qua thẻđiều khiển request liên quan đến tiến trình nhận thơng điệp. Và biến status sẽ nhận được trạng thái của tiến trình nhận nhưđịnh danh thơng điệp v.v...

MPI_Test (MPI_Request *request,int *flag,MPI_Status *status)

Gọi hàm MPI_Test, flag trả về bằng true nếu thao tác gửi hoặc nhận được xác định bằng đối tượng request đã hồn thành. Trong trường hợp này, đối tượng trạng thái status được thiết lập nội dung thơng tin trên thao tác đã hồn thành và đối tượng request sẽ được gán giá trị MPI_REQUEST_NULL.

Ngược lại, flag trả về bằng false. Trong trường hợp này, giá trị của đối tượng trạng thái status là khơng xác định.

Cả hàm MPI_WaitMPI_Test, thơng tin trả về thao tác hồn thành đều dựa trên thơng tin đối tượng trạng thái status. Nội dung của đối tượng trạng thái status. Nếu muốn chờ một tập các truyền thơng giữa các tiến trình hồn thành thì dùng các hàm sau

MPI_ Waitany(int count,MPI_Request *arrayofrequest,int *index,MPI_Status *status)

Khĩa một thao tác truyền thơng (gửi hoặc nhận), liên kết với một đối tượng request trong mảng các đối tượng Request. Nếu nhiều hơn hay bằng một thao tác đã hồn thành, thì MPI_Waitany tùy ý lấy một đối tượng request trong mảng đĩ và hồn thành nĩ, MPI_Waitany sẽ trả về chỉ số của phần tử request trong mảng và trả về trạng thái hồn thành. Đối tượng request đĩ sẽđược giải phĩng và được gán giá trị MPI_REQUEST_NULL

MPI_Testany(int count,MPI_Request *array_of_requests,int *index,int *flag,MPI_Status *status)

Nếu cĩ một hay nhiều hơn một thao tác đã hồn thành, nĩ trả về flag=true, và chỉ số của đối tượng request trong mảng đối tượng Request, và trạng thái của thao tác đĩ và đối tương trạng thái đĩ được giải phĩng và gán giá trị MPI_REQUEST_NULL. Ngược lại, flag=false, và index=MPI_UNDEFINED và status=MPI_UNDEFINED, các giá trị này do MPI định nghĩa dùng trong trường hợp các giá trị trả về khơng thích hợp.

MPI_ Waitall(int count,MPI_Request *arrayofrequest,MPI_Status *arrayofstatus)

Chờ cho đến khi tất cả các thao thác cĩ đối tượng request trong mảng Request hồn thành. Chỉ số trạng thái thứ i trong mảng các trạng thái trả về

Nếu tất cả các thao tác đã hồn thành thì flag=true, và trả về trạng thái status tương ứng trong mảng các trạng thái, giải phĩng tồn bộ các đối tượng request và được gán giá trị là MPI_REQUEST_NULL,

MPI_ Waitsome(int incount,MPI_Request *arrayofrequest,int *outcount,int *offsets,MPI_Status*arrayofstatuses)

Chờ cho đến khi nhiều hơn một truyền thơng được hồn thành, liên kết với những đối tượng request trong mảng. MPI_Waitsome trả về số lượng đối tượng request đã hồn thành.

MPI_Testsome(int incount,MPI_Request *array_of_request,int *outcount,int *array_of_indices,MPI_Status *array_of_statuses)

Cũng như hàm MPI_Waitsome, ngọai trừ nĩ trả về ngay lập tức. Nếu khơng cĩ thao tác nào hồn thành thì outcount=0

MPI_Iprobe(int source,int tag,MPI_Comm comm,int *flag,MPI_Status *status)

Là hàm thuộc dạng non-blocking, trả về flag=true nếu cĩ một thơng điệp mà cĩ thểđược nhận với những thơng tin đặc tả về source, tag, comm. Lời gọi cũng tương thích cùng thơng điệp mà đã được nhận với hàm MPI_Recv (với những tham số như thế này).

4.3.3.4. Các thủ tục liên quan đến đối tượng request Giải phĩng Request(Freeing Requests)

Một đối tượng request cĩ thể được giải phĩng dựa vào các hàm MPI_Wait hay MPI_Test. Ngịai ra, nĩ cịn dược giải phĩng bởi sử dụng những thao tác khác như:

MPI_Request_free(MPI_Request *request)

Nhưng các thao tác này khơng giải phĩng được đối tượng request khi cĩ một sự giao tiếp liên quan đến đối tượng này vẫn tồn tại. Vì thế MPI cung cấp thêm một hàm nữa là :

MPI_Cancel(MPI_Request *request)

Đánh dấu cho việc hủy bỏ thao tác truyền thơng nonblocking (gửi hay nhận) đang bị treo. Nĩ trả về ngay lập tức, cĩ thể trước khi sự thao tác đĩ bị

bỏ. Cũng giống như các hàm MPI_IRecv(..). Hàm này cũng cĩ thể áp dụng các hàm liên quan đến việc chờ đợi như MPI_Wait(..) để biết hàm này đã thực hiện xong hay chưa. Nếu sự truyền thơng khơng bị hủy bỏ (bởi vì sự truyền thơng đã xảy ra trước khi hàm này tỏ ra hiệu quả), ngược lại thì đối tượng request sẽ được giải phĩng và trả về trạng thái thơng tin đã bị hủy bỏ bằng cách sử dụng hàm MPI_Test_cancelled(MPI_Status *status,int *flag): status lưu thơng tin của thao tác cần kiểm tra xem cĩ phải thao tác này đã bị hủy bỏ hay chưa. flag=true nếu xảy ra điều đĩ, ngược lại flag=false.

Một phần của tài liệu Nghiên cứu tính toán lưới và thử nghiệm một số thuật toán lý thuyết đồ thị (Trang 96 - 101)

Tải bản đầy đủ (PDF)

(138 trang)