Chương trình chính

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 35)

Chương trình chính có cấu trúc như sau:

- Khai báo và cấp phát bộ nhớ cho các biến:

Unew, Ucurrent, FU Vnew, Vcurrent, FV Hnew, Hcurrent, FH

- Khởi tạo giá trị ban đầu

Ucurrent, Vcurrent, Hcurrent

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

{

// 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ăng bước thời gian t = t + ht;

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

Chƣơng 3 : Thiết kế giải thuật truyền thông tối ƣu trong chƣơng trình song song

Trong Chương 2 tôi đã trình bày cách cài đặt chương trình tuần tự giải bài toán Shallow – Water Equation thực hiện trên một Processor. Chương trình này bao gồm 2 bước chính là:

- Khởi tạo dữ liệu đầu vào - Tính toán trên dữ liệu này.

Trong [1,3], các tác giả đã đề xuất một số giải thuật truyền thông tối ưu trong chương trình song song cài đặt cho mô hình dự báo thời tiết. Trong chương này tôi sẽ trình bày cách thiết kế giải thuật truyền thông tối ưu và cài đặt chương trình song song, áp dụng cho bài toán phương trình nước nông.

3.1 Ý tƣởng xây dựng giải thuật truyền thông tối ƣu

Trong một chương trình tuần tự thực hiện trên một Processor, các dữ liệu khởi tạo được lưu trên cùng một bộ nhớ. Khi tính toán Processor có thể truy cập tới tất cả các dữ liệu này.

Trong một chương trình song song theo mô hình SPMD thực hiện trên hệ thống tính toán song song có bộ nhớ phân tán, miền tính toán của bài toán (Domain) được chia thành các miền con (Subdomain), mỗi miền con được lưu trữ bởi một bộ nhớ gắn với mỗi Processor tương ứng. Processor này không thể truy cập tới bộ nhớ của Processor khác. Do đó, trong chương trình song song này, chúng ta cần truyền thông. Cụ thể chương trình song song theo mô hình SPMD bao gồm các bước sau:

Học viên: Nguyễn Thị Tố Loan 29 Luận văn thạc sĩ 1) Bước 1: Khởi tạo dữ liệu đầu vào tại một Processor (thông thường tại

Processor có ID = 0, gọi là Root). 2) Bước 2: Chia miền tính toán

3) Bước 3: Phân tán dữ liệu đầu vào tới tất cả các Processor

4) Bước 4: Tính toán (mỗi Processor tính toán trên một Subdomain tương ứng) 5) Bước 5: Tập hợp kết quả từ các Processor về Root.

Như phân tích trong chương 3, khi tính toán tại điểm (i,j) cần dữ liệu tại điểm (i+1,j), (i,j+1) và điểm (i,j). Trong một chương trình tuần tự vấn đề này không cần quan tâm vì tất cả dữ liệu được lưu trong cùng một bộ nhớ. Trong chương trình tính toán song song theo mô hình SPMD giả sử điểm (i,j) nằm trên biên của Subdomain thì điểm (i+1,j) và điểm (i,j+1) có thể nằm trên các Subdomain khác. Do các Processor không thể truy cập bộ nhớ của nhau nên trước khi tính toán ta phải truyền thông dữ liệu. Nói cách khác Bước 4 bao gồm 2 bước con sau:

 Bước 4a: Truyền thông dữ liệu  Bước 4b: Tính toán

Trong một chương trình song song thông thường, các bước 4a và 4b thực hiện tuần tự. Có nghĩa là sau khi việc truyền thông kết thúc việc tính toán mới bắt đầu thực hiện. Nói cách khác các Processor phải chờ đợi quá trình truyền thông, làm giảm hiệu quả của chương trình song song.

Trong chương này tôi sẽ xây dựng giải thuật truyền thông tối ưu trong đó quá trình truyền thông và tính toán được thực hiện đồng thời.

3.2 Cài đặt chƣơng trình song song thông thƣờng

Trong phần này tôi sẽ trình bày cách cài đặt các bước2(), Bước 3 (), bước 4(), bước 5(). Bước khởi tạo dữ liệu giống như trong chương trình tuần tự đã trình bày ở chương 3.

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

3.2.1 Giải thuật chia miền tính toán

Có rất nhiều cách chia miền tính toán. Trong luận văn này tôi sử dụng cách chia miền tính toán Block một chiều như Hình 10.

Trong đó N là số lượng Processor theo chiều y * Xác định kích thước Subdomain

Từ miền tính toán Domain có kích thước L x L ta chia thành NSubdomain theo chiều y là Nsy ta có: ) 1 . 2 . 4 ( N N Nsyy

* Xác định từng địa chỉ của Processor (Tương ứng với vị trí của Subdomain) MPI có lệnh MPI_Comm_Rank() trả về địa chỉ ID một chiều của mỗi Processor, ký hiệu là Rank.

Sau khi xác định được địa chỉ của Processor, gọi i, j là chỉ số của điểm dữ liệu trong Domain, is, js là địa chỉ của điểm dữ liệu đó trong Subdomain như hình trên. Ta có: ) 2 . 2 . 4 ( Rank Ns j j i i y s s    

Hình 10 : Cách chia miền tính toán thành các Subdomain

x y CPU N-1 . . . CPU 1 CPU 0

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

3.2.2 Giải thuật Phân tán dữ liệu đầu vào tới tất cả các Processor

Thông thường dữ liệu được khởi tạo tại Root (CPU = 0), vì vậy chúng ta cần phân tán dữ liệu tới các Processor.

Sau khi đã xác định được miền dữ liệu cho mỗi Subdomain thì dùng lệnh MPI_Scatter để gửi dữ liệu tới tất cả các Processor như sau:

MPI_Scatter(U0,NX*NYs,MPI_FLOAT, Ucurrents,NX*NYs,MPI_FLOAT,0, MPI_COMM_WORLD); MPI_Scatter(V0,NX*NYs,MPI_FLOAT, Vcurrents,NX*NYs,MPI_FLOAT,0, MPI_COMM_WORLD); MPI_Scatter(H0,NX*NYs,MPI_FLOAT, Hcurrents,NX*NYs,MPI_FLOAT,0, MPI_COMM_WORLD); Trong đó:

- U0, V0, H0: giá trị khởi tạo ban đầu, - NX*Nys: Kích thước của Subdomain, - 0: ID của Root,

- Ucurrents, Vcurrents, Hcurrents: Giá trị khởi tạo trên các subdomain, - FLOAT là kiểu dữ liệu MPI.

- COMM là người giao tiếp được chia sẻ bởi các quá trình gửi và nhận. Quy trình chỉ có mà chia sẻ cùng người giao tiếp có thể giao tiếp.

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

3.2.3.Tính toán

3.2.3.1 Giải thuật truyền thông thông thường

Khi tính toán tại điểm (i,j) ta cần dữ liệu tại điểm (i+1,j), (i,j+1) và điểm (i,j). Nếu (i,j) nằm trên biên thì (i,j+1) nằm trên Subdomain lân cận. Do đó để tính toán các điểm trên biên này ta cần sử dụng dữ liệu thu được từ truyền thông của Sudomain lân cận.

Để thuận lợi ta chia miền tính toán Subdomain thành hai phần:

- Một phần gồm những điểm trong đó việc tính toán không cần dữ liệu của các Subdomain lân cận.

- Một phần gồm những điểm trong đó việc tính toán cần dữ liệu của các Subdomain lân cận (Miền này được gọi là miền Halozone)

Hình này mô tả cách phân chia trong đó phần trắng là phần gồm các điểm không cần dữ liệu của Subdomain lân cận. Phần đen là phần gồm các điểm mà tính toán phụ thuộc dữ liệu ở các Subdomain lân cận

Giải thuật truyền thông được mô tả như Hình 12.

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

Hình 12: Truyền thông

CPU0

CPU1

Điều kiện biên

CPUN-1

Học viên: Nguyễn Thị Tố Loan 34 Luận văn thạc sĩ Giải thích chi tiết:

Những điểm màu đen là những điểm tính toán cần dữ liệu của các Processor trên. Những điểm màu trắng là những điểm chuyển cho Procesor bên dưới. Những điểm đen trên Processor của CPUN-1 lấy điều kiện biên

Những điểm nhận về (điểm trắng) tôi lưu vào mảng Udb, Vdb, Hdb Giải thuật truyền thông như sau:

if (rank==NP-1){

for (i=0;i<NX;i++) *(Udb+i) = 0.0; //boundary condition MPI_Send(Ucurrents,NX,MPI_FLOAT,rank-1,rank,MPI_COMM_WORLD); } else if (rank!=0) { 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); } else { MPI_Recv(Udb,NX,MPI_FLOAT,rank+1,rank+1,MPI_COMM_WORLD,&status);

3.3.2.2 Giải thuật tính toán

Trong chương trình tuần tự ta tính toán trên toàn miền, còn trong chương trình song song ta chỉ tính trên Subdomain

Sửa Ny thành Nys như sau:

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

for (j=0, j<Nys, j++)

{ Ud = (j==Nys-1) ? *(Udb+i)=0) }

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

3.2.4. Tập hợp kết quả từ các Processor về Root.

Sau khi các Processor tính toán xong trên các Subdomain, kết quả vẫn bị phân tán trên các bộ nhớ của các Process. Dùng lệnh MPI_Gather để tập hợp kết quả từ các Processor về Root, ví dụ:

MPI_Gather(Hcurrents,NX*NYs,MPI_FLOAT, H,NX*NYs,MPI_FLOAT,0, MPI_COMM_WORLD);

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

// 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){

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); }

//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.

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

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 35)

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

(57 trang)