Cấu trúc hàm main của chương trình song song thông thường

Một phần của tài liệu Tối ưu hóa truyền thông trong chương trình song song (Trang 43)

// Khai báo và cấp phát bộ nhớ cho các biến trên Domain: // Unew, Ucurrent, FU

// Vnew, Vcurrent, FV // Hnew, Hcurrent, FH - Phân chia miền tính toán

// Khai báo và cấp phát bộ nhớ cho các biến trên Subdomain: // Unews, Ucurrents, FUs

// Vnews, Vcurrents, FVs

// Hnews, Hcurrent, FHs

- Khởi tạo giá trị ban đầu tại Root - Phân chia dữ liệu đầu vào - Tính toán U, V, H lặp như sau:

Học viên: Nguyễn Thị Tố Loan 36 Luận văn thạc sĩ while (t <= T)

{

// Truyền thông giữa các Processor // Rời rạc hóa theo không gian //Tích hợp theo thời gian // Cập nhật giá trị t = t + ht;

}

- Tập hợp kết quả đầu ra

3.3 Giải thuật truyền thông trong chƣơng trình song song tối ƣu

Để thực hiện tối ưu hóa truyền thông tôi chia việc tính toán trên mỗi Subdomain thành 2 bước: tính toán trên miền trắng (khi tính toán không cần dữ liệu của các Subdomain lân cận), tính toán trền miền đen (khi tính toán cần dữ liệu của các Subdomain lân cận) (Xem Hình 11). Do việc tính toán trên miền trắng có thể thực hiện độc lập nên ta có thể thực hiện trước khi truyền thông, việc tính toán trên miền đen phụ thuộc vào dữ liệu của các Processor lân cận nên phải được thực hiện sau khi truyền thông. Do đó ta có thể thiết kế giải thuật truyền thông tối ưu như sau:

Bước 1: Truyền thông giữa các Processor, Bước 2: Tính toán trên miền trắng,

Bước 3: Đồng bộ

Học viên: Nguyễn Thị Tố Loan 37 Luận văn thạc sĩ Bước 2:

for (i=0; i<Nx; i++) for (j=0; j<Nys-1; j++) {

// Tính toán }

Bước 4:

for (i=0; i<Nx; i++)

for (j=Nys - 1; j<Nys; j++) {

// Tính toán }

Bước 1: Về cấu trúc, bước truyền thông trong chương trình song song tối ưu cũng giống như bước truyền thông trong chương trình truyền thông song song thông thường. Chỉ khác ở chỗ để có thể thực hiện đồng thời bước 1 và bước 2 thì ta phải thực hiện phương thức truyền thông cận đồng bộ (unblocking MPI). Cụ thể ta thay các lệnh MPI_Send(), MPI_Rcev() bằng các lệnh MPI_Isend(), MPI_Ircev().

Hình 13 mô tả 2 phương thức truyền thông đồng bộ và cận đồng bộ. Nhìn hình vẽ ta thấy có lợi thế tiết kiệm thời gian

Học viên: Nguyễn Thị Tố Loan 38 Luận văn thạc sĩ Bước 3: Trong phương thức truyền thông Unblocking, do ta không biết lúc nào truyền thông kết thúc nên ta phải đồng bộ hóa. Việc đồng bộ hóa được sử dụng bởi lệnh MPI_Wait().

Hàm main() của chương trình song song tối ưu được sửa như sau: ……….

- Tính toán U, V, H lặp như sau: while (t <= T)

{

// Bước 1: truyền thông giữa các Processor,

//Us

if (rank==NP-1){ (adsbygoogle = window.adsbygoogle || []).push({});

for (i=0;i<NX;i++) *(Udb+i) = 0.0; //boundary condition

//MPI_Send(Ucurrents,NX,MPI_FLOAT,rank-1,rank,MPI_COMM_WORLD); MPI_Isend(Ucurrents,NX,MPI_FLOAT,rank-1,rank, MPI_COMM_WORLD,&Req[0]); } else if (rank!=0) { B1 B2 B4 Blocking MPI

Hình 13 - Truyền thông Blocking và unblocking

Unblocking MPI

B1 B3 B4

Học viên: Nguyễn Thị Tố Loan 39 Luận văn thạc sĩ //MPI_Send(Ucurrents,NX,MPI_FLOAT,rank-1,rank,MPI_COMM_WORLD); //MPI_Recv(Udb,NX,MPI_FLOAT,rank+1,rank+1,MPI_COMM_WORLD,&status); // MPI_Isend(Ucurrents,NX,MPI_FLOAT,rank-1,rank, MPI_COMM_WORLD,&Req[0]); MPI_Irecv(Udb,NX,MPI_FLOAT,rank+1,rank+1,MPI_COMM_WORLD,&Req[1]); } else { //MPI_Recv(Udb,NX,MPI_FLOAT,rank+1,rank+1,MPI_COMM_WORLD,&status); MPI_Irecv(Udb,NX,MPI_FLOAT,rank+1,rank+1,MPI_COMM_WORLD,&Req[0]); } //Vs if (rank==NP-1){

for (i=0;i<NX;i++) *(Vdb+i) = 0.0; //boundary condition

//MPI_Send(Vcurrents,NX,MPI_FLOAT,rank-1,rank,MPI_COMM_WORLD); MPI_Isend(Vcurrents,NX,MPI_FLOAT,rank- 1,rank,MPI_COMM_WORLD,&Req[1]); } else if (rank!=0) { //MPI_Send(Vcurrents,NX,MPI_FLOAT,rank-1,rank,MPI_COMM_WORLD); //MPI_Recv(Vdb,NX,MPI_FLOAT,rank+1,rank+1,MPI_COMM_WORLD,&status); // MPI_Isend(Vcurrents,NX,MPI_FLOAT,rank- 1,rank,MPI_COMM_WORLD,&Req[2]); MPI_Irecv(Vdb,NX,MPI_FLOAT,rank+1,rank+1,MPI_COMM_WORLD,&Req[3]); }

Học viên: Nguyễn Thị Tố Loan 40 Luận văn thạc sĩ else { //MPI_Recv(Vdb,NX,MPI_FLOAT,rank+1,rank+1,MPI_COMM_WORLD,&status); MPI_Irecv(Vdb,NX,MPI_FLOAT,rank+1,rank+1,MPI_COMM_WORLD,&Req[1]); } //Hs if (rank==NP-1){

for (i=0;i<NX;i++) *(Hdb+i) = 0.0; //boundary condition

//MPI_Send(Hcurrents,NX,MPI_FLOAT,rank-1,rank,MPI_COMM_WORLD); MPI_Isend(Hcurrents,NX,MPI_FLOAT,rank- 1,rank,MPI_COMM_WORLD,&Req[2]); } else if (rank!=0) { //MPI_Send(Hcurrents,NX,MPI_FLOAT,rank-1,rank,MPI_COMM_WORLD); //MPI_Recv(Hdb,NX,MPI_FLOAT,rank+1,rank+1,MPI_COMM_WORLD,&status); // MPI_Isend(Hcurrents,NX,MPI_FLOAT,rank- 1,rank,MPI_COMM_WORLD,&Req[4]); MPI_Irecv(Hdb,NX,MPI_FLOAT,rank+1,rank+1,MPI_COMM_WORLD,&Req[5]); } else { //MPI_Recv(Hdb,NX,MPI_FLOAT,rank+1,rank+1,MPI_COMM_WORLD,&status); MPI_Irecv(Hdb,NX,MPI_FLOAT,rank+1,rank+1,MPI_COMM_WORLD,&Req[2]); }

//Bước 2: tính toán trên miền trắng,

Học viên: Nguyễn Thị Tố Loan 41 Luận văn thạc sĩ

for (j = 0 ; j < NYs-1 ; j++){

// TINH Uc = U(i,j),Vc = V(i,j),Hc = H(i,j) Uc = *(Us+Index(i,j,NX));

Vc = *(Vs+Index(i,j,NX)); Hc = *(Hs+Index(i,j,NX));

// TINH Uu = U(i+1,j),Vu = V(i+1,j),Hu = H(i+1,j) // Cyclic Boundary Condition in x-direction

Ur = (i==NX-1) ? *(Us+Index(0,j,NX)) : *(Us+Index(i+1,j,NX)); Vr = (i==NX-1) ? *(Vs+Index(0,j,NX)) : *(Vs+Index(i+1,j,NX)); Hr = (i==NX-1) ? *(Hs+Index(0,j,NX)) : *(Hs+Index(i+1,j,NX)); // TINH Ud = U(i,j+1),Vd = V(i,j+1),Hd = H(i,j+1)

Ud = (j==NYs-1) ? *(Udb+i) : *(Us+Index(i,j+1,NX)); Vd = (j==NYs-1) ? *(Vdb+i) : *(Vs+Index(i,j+1,NX)); Hd = (j==NYs-1) ? *(Hdb+i) : *(Hs+Index(i,j+1,NX)); // TINH Ux,Uy THEO PP SAI PHAN THUAN

Ux = (Ur - Uc)/hx; Uy = (Ud - Uc)/hy;

// TINH Vx,Vy THEO PP SAI PHAN THUAN Vx = (Vr - Vc)/hx;

Vy = (Vd - Vc)/hy;

// TINH Hx,Hy THEO PP SAI PHAN THUAN Hx = (Hr - Hc)/hx;

Hy = (Hd - Hc)/hy; // TINH dU,dV,dH

Học viên: Nguyễn Thị Tố Loan 42 Luận văn thạc sĩ

*(dVs+Index(i,j,NX)) = - f*Uc - Uc*Vx - Vc*Vy - g*Hy; *(dHs+Index(i,j,NX)) = - Uc*Hx - Hc*Ux - Vc*Hy - Hc*Vy; }

// Bước 3: đồng bộ hóa dữ liệu,

if (rank==NP-1){ MPI_Waitall(3,Req,status2); } else if (rank!=0){ MPI_Waitall(6,Req,status2); } else { MPI_Waitall(3,Req,status2); } (adsbygoogle = window.adsbygoogle || []).push({});

//Bước 4: tính toán trên miền đen,

for (i = 0 ; i < NX ; i++)

for (j = NYs -1 ; j < NYs ; j++){

// TINH Uc = U(i,j),Vc = V(i,j),Hc = H(i,j) Uc = *(Us+Index(i,j,NX));

Vc = *(Vs+Index(i,j,NX)); Hc = *(Hs+Index(i,j,NX));

// TINH Uu = U(i+1,j),Vu = V(i+1,j),Hu = H(i+1,j) // Cyclic Boundary Condition in x-direction

Ur = (i==NX-1) ? *(Us+Index(0,j,NX)) : *(Us+Index(i+1,j,NX)); Vr = (i==NX-1) ? *(Vs+Index(0,j,NX)) : *(Vs+Index(i+1,j,NX)); Hr = (i==NX-1) ? *(Hs+Index(0,j,NX)) : *(Hs+Index(i+1,j,NX)); // TINH Ud = U(i,j+1),Vd = V(i,j+1),Hd = H(i,j+1)

Học viên: Nguyễn Thị Tố Loan 43 Luận văn thạc sĩ

Ud = (j==NYs-1) ? *(Udb+i) : *(Us+Index(i,j+1,NX)); Vd = (j==NYs-1) ? *(Vdb+i) : *(Vs+Index(i,j+1,NX));

Hd = (j==NYs-1) ? *(Hdb+i) : *(Hs+Index(i,j+1,NX)); // TINH Ux,Uy THEO PP SAI PHAN THUAN

Ux = (Ur - Uc)/hx; Uy = (Ud - Uc)/hy;

// TINH Vx,Vy THEO PP SAI PHAN THUAN Vx = (Vr - Vc)/hx;

Vy = (Vd - Vc)/hy;

// TINH Hx,Hy THEO PP SAI PHAN THUAN Hx = (Hr - Hc)/hx;

Hy = (Hd - Hc)/hy; // TINH dU,dV,dH

*(dUs+Index(i,j,NX)) = f*Vc - Uc*Ux - Vc*Uy - g*Hx; *(dVs+Index(i,j,NX)) = - f*Uc - Uc*Vx - Vc*Vy - g*Hy; *(dHs+Index(i,j,NX)) = - Uc*Hx - Hc*Ux - Vc*Hy - Hc*Vy; }

// Cập nhật giá trị

t = t + ht; }

Học viên: Nguyễn Thị Tố Loan 44 Luận văn thạc sĩ

Chƣơng 4 : Chạy thử nghiệm chƣơng trình và đánh giá kết quả

4.1. Các nền tảng tính toán song song.

Chúng tôi chạy thử nghiệm chương trình trên máy trạm (WorkStation) Dell Precision T7610. Thông số cơ bản của máy tính trạm T7610 như sau:

Workstation Dell Precision T7610 workstation Chassis Tower Chassis

Processor

Intel Xeon Processor E5-2650 v2 (Eight Core HT, 2.6GHz Turbo, 20 MB) Chipset Intel® C602 Memory: 32GB (4x8GB) 1866MHz DDR3 ECC RDIMM Quad channel; up to 512GB 1866MHz ECC RDIMM memory; 16 DIMM slots (8 per processor)

Hard disk : 2 x 300GB 2.5inch SAS (15,000 Rpm) Hard Drive

Drive Controllers

Intergrated LSI 2308 6Gb/s SATA/SAS Controller - SW RAID 0,1,10

Học viên: Nguyễn Thị Tố Loan 45 Luận văn thạc sĩ Máy tính trạm T7610 có 8 nhân tốc độ 2.6GHz, mỗi nhân có 2 luồng, bộ nhớ RAM 32GB.

Về phần mềm, chúng tôi sử dụng trình biên dịch gcc cho code C, mpich2 cho code MPI, cài đặt trên hệ điều hành Ubuntu 14. (adsbygoogle = window.adsbygoogle || []).push({});

4.2 Thử nghiệm và phân tích kết quả..

4.2.1. Kiểm tra tính chính xác của chương trình:

Trước tiên để kiểm tra tính chính xác của chương trình C và MPI thông thường và MPI tối ưu, tôi chạy cả ba chương trình, sau đó so sánh kết quả đầu ra (Giá trị của U, V, H) của chúng. Kết quả cho thấy đầu ra của ba chương trình C và MPI thông thường và MPI tối ưu giống hệt nhau. Điều này khẳng định rằng chương trình MPI thông thường và MPI tối ưu được cài đặt chính xác.

4.2.2. Đánh giá hiệu quả của C so với MPI

So sánh kết quả thời gian chạy trên C và MPI thông thường trong máy tính có 4 nhân với cùng kích thước mảng dữ liệu:

Kích thƣớc 1024 x 1024 C (-O3) MPI thông thƣờng với số nhân bằng 4

Thời gian 148.714 ms 86.503 ms

Bảng 5 : Kết quả thời gian chạy trong C và MPI thông thường

Do trong chương trình C tôi đã chạy chương trình với gcc –O3 nên trình biên dịch đã tối ưu hóa code chạy trên nhiều Process, do đó mặc dù chương trình MPI chạy trên 4 nhân mà thời gian chỉ giảm đi gần 2 lần.

Học viên: Nguyễn Thị Tố Loan 46 Luận văn thạc sĩ

4.2.3 Đánh giá hiệu quả của MPI trên nhiều nhân

Kích thƣớc 1024 x 1024 Số nhân NP =2 Số nhân NP=4 Số nhân NP=8

Thời gian 121.958 ms 86.503 ms 44. 055 ms

Bảng 6 : Kết quả thời gian chạy trong MPI thông thường

Do khi thực hiện chương trình với số nhân NP = 2 thời gian truyền thông nhỏ nên khi số nhân tăng lên NP=4 thời gian giảm không đạt như mong muốn là giảm 2 lần. Nhưng khi số nhân tăng lên NP = 8 thì thời gian giảm gần 1.95 lần so với số nhân NP = 4. Điều này chứng tỏ hiệu suất của chương trình MPI tốt.

4.2.4 Đánh giá hiệu quả của thuật toán truyền thông tối ưu

So sánh kết quả thời gian chạy của MPI thông thường và MPI tối ưu với cùng 1 máy tính có số nhân bằng 16

Kích thƣớc 1024 x1024 MPI thông thƣờng MPI tối ƣu

Thời gian 20.531 ms 15.837 ms

Bảng 7: Kết quả thời gian chạy của MPI thông thường và MPI tối ưu

Từ bảng này ta thấy chương trình MPI truyền thông tối ưu đã giảm được 23% thời gian thực hiện chương trình so với MPI truyền thông thông thường. Điều này chứng tỏ rằng thuật toán truyền thông tối ưu đã xây dựng rất tốt.

Học viên: Nguyễn Thị Tố Loan 47 Luận văn thạc sĩ

Kết luận

Luận văn đã nghiên cứu về giao tiếp truyền thông dữ liệu và cơ chế hoạt động trong ngôn ngữ lập trình C có sử dụng thư viện MPI thông thường và MPI tối ưu tạo tiền đề giúp giải quyết bài toán phương trình nước nông. Do bài toán có sự phụ thuộc dữ liệu nên cần đến vấn đề truyền thông. Có 2 phương pháp truyền thông trong MPI đó là truyền thông Blocking MPI và truyền thông Unblocking MPI. Nhưng tôi đã lựa chọn phương pháp truyền thông Unblocking MPI để giải quyết bài toán vì bài toán có thể thực hiện cùng một lúc cả truyền thông và cả tính toán trên miền không phụ thuộc dữ liệu.

Từ những hiểu biết có được nhờ việc nghiên cứu tác giả đã thử nghiệm năng lực tính toán, thời gian tính toán của C so với MPI thông thường và MPI tối ưu của bài toán Shalldow Water Equation để kiểm chứng được những điều mong muốn đã đặt ra. Kết quả đầu ra sau khi thực hiện của C, MPI thông thường và MPI tối ưu là như nhau, khẳng định tính chính xác của chương trình.

Khi tăng số lượng Process lên thì thời gian thực hiện chương trình MPI giảm đi với số lần tương ứng chứng tỏ hiệu suất của chương trình MPI là tương đối tốt.

Thời gian chạy của chương trình MPI tối ưu giảm được khoảng 23% so với chương trình MPI thông thường. Chứng tỏ thuật toán MPI tối ưu tôi đưa ra là tốt.

Với kết quả đạt được tôi mong muốn sẽ cải tiến được chương trình tối ưu hơn, ứng dụng thực tế đạt kết quả tốt hơn.

Học viên: Nguyễn Thị Tố Loan 48 Luận văn thạc sĩ

Tài liệu tham khảo: (adsbygoogle = window.adsbygoogle || []).push({});

[1] Van Thieu Vu, Gerard Cats, Lex Wolters: Overlapping Communications With Calculations. CSREA Press, 2009.

[2] Van Thieu Vu, Gerard Cats, and Lex Wolters, Automatic code generation for Finite Element Methods applied to the Shallow-Water equations, In Proceedings of the 2009 International Conference on Scientific Computing (CSC 2009), CSREA Press, pp 101-107, Las Vegas, USA, July 2009.

[3] Van Thieu Vu, Opportunities for performance optimization of applications through code generation, PhD thesis, 2012.

[4] Tutorial Material on MPI,

http://www.mcs.anl.gov/research/projects/mpi/tutorial/gropp/talk.html [5] M. Ashworth, Parallel Processing in Environmental Modelling, In

Proceedings of the 5th ECMWF Workshop on the use of parallel processors in Meteorology, pp 1-25, Reading, UK, November 1992. [6] R. Buyya (editor), High Performance Cluster Computing: Programming

and Applications, ISBN 0-13-013785-5, Prentice Hall PTR, NJ, USA, 1999.

[7] Vipin Kumar, Ananth Grama, Anshul Gupta, and George Karpis,

Introduction to Parallel Computing: Design and Analysis of Parallel Algorithms, Addison-Wesley, 2003. ISBN 0-201-64865-2.

[8] J. Steppeler, Energy conserving Galerkin finite element schemes, for the primitive equation of numerical weather prediction, Journal of Computation Physics, Vol.69, No. 1,pp 258-264,1987.

Học viên: Nguyễn Thị Tố Loan 49 Luận văn thạc sĩ [9] Hundsdorfer, W., & Verwer, J. G. (2003). Numerical solution of time

dependent advection-diffusion-reaction equations (Vol. 33). Springer Science & Business Media.

Một phần của tài liệu Tối ưu hóa truyền thông trong chương trình song song (Trang 43)