Đồng bộ hĩa

Một phần của tài liệu CNTT1001 (Trang 109 - 123)

MPI_Barrier (MPI_Comm comm)

Tạo ra một rào cản đồng bộ trong một nhĩm. Mỗi tác vụ, khi tiến tới lời gọi MPI_Barrier, thì khĩa lại cho đến khi nào tất cả các tác vụ khác trong nhĩm cũng tiến tới cùng một lời gọi MPI_Barrier. Chức năng này giúp tất cả các xử lý trong nhĩm đã nhận hết được dữ liệu.

4.4.2. Di di d liu trong nhĩm

MPI_Bcast(void *buffer,int count,MPI_Datatype datatype,int root,MPI_Comm comm)

Broadcast (gửi) một thơng điệp từ xử lý với rank=root tới tất cả các xử lý cịn lại trong cùng một communicator (trong cùng một nhĩm với nhau)

Các xử lý trong một communicator sẽ nhận dữ liệu của tiến trình gửi broadcast

Tham số Diễn giải Buffer địa chỉ của bộđệm ứng dụng Count Số lượng thực thể trong buffer Datatype Dạng dữ liệu của buffer

Root Rank của xư lý gọi Broadcast

http://etrithuc.vn Hình 4-10 : Broadcast dữ liệu

MPI_Scatter(void *sendbuff,int sendcnt,MPI_Datatype sendtype,void *recvbuf,int recvcnt,MPI_Datatype recvtype,int root,MPI_Comm comm)

Phân phối và chia nhỏ thơng điệp thành n phần khác nhau từ một xử

lý nguồn và gửi đến mỗi xử lý cịn lại trong communicator. Hàm này giống như gồm n hàm MPI_Send với n là số tiến trình và mỗi tiến trình đều thực hiện hàm MPI_Recv(...) . Tất cả các tham số đều quan trong với tiến trình gửi Broadcast, cịn lại các tiến trình khác chỉ quan tâm bộ đệm nhận, communicator, tiến trình gửi, dạng dữ liệu và số dữ liêu được nhận.

Cho phép một số lượng dữ liêu được gửi đến mỗi tiến trình, bởi vì sendcount là một mảng và cịn cĩ thêm một tham số nữa là mảng displs dùng để quy định các địa chỉ của sendbuf được chia ra như thế nào.

http://etrithuc.vn Hình 4-11 : Ví dụ hàm Scatter

Sự mở rộng của hàm Scatter là: MPI_Scatterv(void *sendbuf,int *sendcounts,int *displs,MPI_Datatype sendtype,void *recvbuf,int recvcount,MPI_Datatype recvtype,int root,MPI_Comm comm)

Trái ngược với các hàm MPI_Scatter thì gồm các hàm sau đây MPI_Gather(void *sendbuff,int sendcnt,MPI_Datatype sendtype,void *recvbuf,int recvcount,MPI_Datatype recvtype,int root, MPI_Comm comm)

Hàm này cĩ nhiệm vụ lấy lại tất cả các thơng điệp từ mỗi tác vụ

trong một nhĩm vào một tác vụđích duy nhất.

Mỗi xử lý (kế cả xử lý ở root) đều phải gửi thơng tin về sendbuf đến tiến trình root,và tiến trình root sẽ nhận thơng điệp và lưu chúng trong một danh sách cĩ thứ tự các định danh tiến trình (rank) .

http://etrithuc.vn Hình 4-12 : Hàm MPI_Gather

MPI_Allgather(void *sendbuf,int sendcount,MPI_Datatype sendtype,void * recvbuf,int recvcount,MPI_Datatype recvtype,MPI_Comm comm)

Cũng giống như hàm MPI_Gather(...) ngoại trừ là tất cả các tiến trình tham gia đều cĩ giá trị thay vì chỉ một tiến trình root sau khi thực hiện gather. Kết qủa của hàm gọi MPI_Allgather(..) cũng như là tất cả các tiến trình thực thi hàm MPI_Gather và đều nhận được kết quả như nhau

Hình 4-13 : Hàm MPI_Allgather

MPI_Alltoall(void *sendbuf,int sendcount,MPI_Datatype sendtype,void *recvbuff,int *recvcount,MPI_Datatype recvtype,MPI_Comm comm)

http://etrithuc.vn là một sự mở rộng của hàm MPI_Allgather. Mỗi xử lý sẽ gửi dữ liệu phân biệt đến mỗi trình nhận.Xử lý thứ i sẽ gửi khối thứ j đến xử lý thứ j và được thay thế trong khối thứ i của bộ nhớ lưu trữ nhận Hình 4-14 : Hàm MPI_Alltoall 4.4.3. Tính tốn gp

Các hàm ở dạng này cung cấp thêm tính tốn gộp trên các xử lý với nhau (ví dụ như tính tổng ,tính giá trị lớn nhất...) các gía trị thuộc về các thành viên của nhĩm xử lý . Cũng giống như các hàm collective operation khác, những hàm này cũng cĩ hai dạng, đĩ là kết quả tính tốn trả về trên một nút hoặc kết quả tính tốn trả về trên nhiều nút (nút ở đây xem như là một xử lý hay một máy trên một mạng)

MPI_Reduce(void *sendbuf,void *recvbuf,int count,MPI_Datatype datatype,MPI_Op op,int root,MPI_Comm comm)

http://etrithuc.vn

Tính giá trị của tất cả các tiến trình trong communicator gửi đến và sau đĩ đưa giá trị tính tốn đĩ về một tiến trình cĩ rank=root.

http://etrithuc.vn 4.4.3.1. Một số kiểu tính tốn do MPI cung cấp

CÁC TH TC TÍNH TỐN KIU D LIU ĐƯỢC S

DNG

MPI_MAX Tính giá trị lớn nhất integer,float MPI_MIN Tính giá trị nhỏ nhất integer,float MPI_SUM Tính tổng integer,float MPI_PROD product integer,float

MPI_LAND Tốn tử luận lý AND integer

MPI_BAND Tốn tử dấu bit AND integer,MPI_BYTE MPI_LOR Tốn tử luận lý OR integer

MPI_BOR Tốn tử dấu bit OR integer,MPI_BYTE MPI_LXOR Tốn tử luận lý XOR integer

MPI_BXOR Tốn tử dấu bit XOR integer,MPI_BYTE MPI_MAXLOC Tính giá trị lớn nhất và

thêm thơng tin rank của tiến trình chứa giá trị lớn nhất

integer,double,và long double

MPI_MINLOC Tính giá trị nhỏ nhất và thêm thơng tin rank của tiến trình chứa giá trị nhỏ nhất

integer,double,và long double

4.4.3.2. Một số kiểu tính tốn do người dùng định nghĩa

Để viết một hàm với chức năng do người dùng định nghĩa dựa vào thuật tốn của hàm MPI_Reduce cung cấp cĩ thể thực hiện theo 3 bước sau :

Kiểm tra phương pháp tính tốn cĩ phù thuộc vào những yêu cầu sau đây khơng?

http://etrithuc.vn

Bước 1: Cĩ tính kết hợp Ví dụ a + (b+c)=(a+b)+c Cĩ tính giao hốn Ví dụ a+b=b+a

Bước 2 : bổ sung tốn tử vào hàm gộp (reduction) theo quy tắc sau

Hàm myfunc(void *in,void *inout,int *len,MPI_Datatype *datatype)

Bước 3 : Đăng ký hàm này với MPI int commute,myop; commute=1 MPI_Op_create(myfunc,commute,&myop) MPI_Reduce(...,myop,..) Hình 4-16 : Sử dụng 8 xử lý để tính giá trị tuyệt đối Mt s hàm tính tốn gp cịn li :

MPI_Allreduce(void *sendbuf,void *recvbuf,int count,MPI_Datatype datatype,MPI_Op op,MPI_Comm comm)

Cũng giống như hàm MPI_Reduce nhưng tất cả các xử lý trong cùng một communicator sẽ nhận giá trị tính tốn được

http://etrithuc.vn Hình 4-17 Hàm Mpi-Allreduce

MPI_Reduce_scatter(void *sendbuf,void *recvbuf,int

recvcount,MPI_Datatype datatype,MPI_Op op,MPI_Comm comm)

MPI_Reduce_scatter thực hiện hai bước. Bước thứ nhất là dùng tính tốn gộp trên mỗi giá trị từ bộ đệm gửi (và dĩ nhiên là mỗi giá trị này sẽ lưu trong một mảng). Sau đĩ mảng này sẽ được phân chia ra thành n đoạn (với n là số xử lý ). Đoạn thứ i sẽ chứa giá trị thứ i trong mảng đã tính tốn. Và đoạn thứ i sẽđược gửi đến xử lý thứ i và lưu trong bộđệm nhận.

Hình 4-18 : Hàm MPI_Reduce_scatter

MPI_Scan(void *sendbuf,void *recvbuf,int count,MPI_Datatype datatype,MPI_Op op,MPI_Comm comm)

http://etrithuc.vn

trên các tiến trình từ 0 dến i. Hình vẽ sau đây sẽ minh họa rõ hơn về điều này

Hình 4-19 : Hàm MPI_Scan

4.5. Các kiu d liu

4.5.1. Nhng kiu d liu đã được định nghĩa

Kiểu dữ liệu của MPI Kiểu dữ liệu của C MPI_CHAR signed char

MPI_SHORT signed short int MPI_INT signed int MPI_LONG signed long int MPI_UNSIGNED _CHAR unsigned char MPI_UNSIGNED_SHORT unsigned short int MPI_UNSIGNED unsigned int MPI_UNSIGNED_LONG unsigned long int

MPI_FLOAT float

MPI_DOUBLE double MPI_LONG_DOUBLE long double MPI_BYTE

MPI_PACKED Kiểu dữ liêu khác

MPI_BYTE khác với MPI_CHAR, với một số máy tính thì MPI_CHAR cĩ thể

http://etrithuc.vn

một ký tự 2 byte (16 bit _mã Unicode chẳng hạn) cịn giá trị của MPI_BYTE là số 1 byte (8 bit) trong tất cả các trường hợp.

Tất cả các kiểu dữ liệu cịn lại gần giống với các kiểu dữ liệu của C .Ngồi ra cịn cĩ thêm kiểu dữ liệu MPI_Packed ,một dạng dữ liệu nén mà chúng ta sẽ đề cập sau

4.5.2. Các kiu d liu b sung

Ngồi những kiểu dữ liêu do MPI cung cấp như

MPI_BYTE,MPI_DOUBLE v.v…thì MPI cịn cung cấp khả năng cho việc

định nghĩa chính cấu trúc dữ liệu dựa trên các dạng dữ liệu chính. Những cấu trúc do người dùng định nghĩa được gọi là dạng dữ liệu bổ sung.

MPI cung cấp một số phương pháp cho việc cấu trúc những kiểu dữ liệu sau

đây : + Contiguous + Vector + Indexed + Struct 4.5.2.1. Contiguous Cấu trúc đơn giản nhất .Sản sinh ra một dạng dữ liệu mới bằng cách tạo một số lượng những bản sao chép của một dạng dữ liệu đã cĩ

http://etrithuc.vn Hình 4-20 : MPI_Type_contiguous

4.5.2.2. Vector

MPI_Type_vector(int count,int blocklenght,int stride, MPI_Datatype oldtype, MPI_Datatype*newtype)

Cũng giống như contiguous, nhưng cho phép khoanh vùng dữ liệu muốn

đăc tả .MPI_Type_hvector cũng giống như MPI_Type_vector ngoại trừ phạm vi được đặc tảở dạng byte

IN :

count : số lượng block

blocklenght : số lượng của những thành phần bên trong mỗi block stride : số lượng của những thành phần giữa vị trí bắt đầu của mỗi block oldtype : dạng dữ liệu cũ (handle)

OUT :

http://etrithuc.vn Hình 4-21 : MPI_Type_vetor

4.5.2.3. Indexed

Định nghĩa dữ liệu khơng liên tục ,khoảng cách khơng cố định và đều đặn. Hàm được sử dụng là

MPI_Type_indexed(int count,int []blocklens,int []indices,MPI_Datatype old_type,MPI_Datatype *newtype)

Dạng dữ liệu tạo ra theo chỉ số của mảng dữ liệu đầu vào và vùng mảng

http://etrithuc.vn Hình 4-22 : MPI_Type_indexed

4.5.2.4. Struct

Vấn đề đặt ra là MPI khơng cho truyền dữ liệu bằng kiểu cấu trúc .Do đĩ ,lập trình viên phải định nghĩa cấu trúc sau đĩ đặt tả cầu trúc đĩ theo dạng byte theo sự trợ giúp của các hàm MPI .

MPI_Type_struct (int count,int []blocklens,int[]offsets,MPI_Datatype oldtypes,MPI_Datatype *newtype)

http://etrithuc.vn

Các hàm liên quan khác đến dng d liu b sung :

MPI_Type_extent(MPI_Datatype,MPI_Aint* extent)

Trả về kích thước của dạng dữ liệu được đặc tả.Trả về kích thước theo dạng BYTE.

MPI_Type_commit( MPI_Datatype datatype)

Đăng ký dạng dữ liệu mới với hệ thống. Đây là hàm yêu cầu cho tất cả các hàm tạo ra kiểu dữ liệu mới trước khi sử dụng

Một phần của tài liệu CNTT1001 (Trang 109 - 123)