Home > Programming > Hybrid MPI & OpenMP

Hybrid MPI & OpenMP

Cluster[1] là một hệ thống bao gồm nhiều node liên kết với nhau bằng network. Thông thường mỗi node trong cluster được trang bị một hoặc nhiều CPU, với xu thế chung là sử dụng CPU nhiều nhân, một số node còn được gắn thêm GPU. Những cluster dạng này ngày càng được sử dụng phổ biến, ví dụ trong top500 siêu máy tính mạnh nhất thế giới thì có đến 82% sử dụng cluster [2].

Hình 1[3]: cấu trúc của một cluster

Để viết một chương trình chạy song song trên cluster, MPI có thể là một trong những công cụ cần nghĩ đến trước hết. MPI có thể đảm nhận tốt việc giao tiếp giữa các process trên các node khác nhau. Mặc dù có cũng có thể được dùng cho giao tiếp trong node, MPI không tận dụng được lợi thế của shared memory, dẫn đến lãng phí do lưu nhiều bản sao của biến và các giao tiếp không cần thiết giữa các process. Trong khi đó, OpenMP lại tỏ ra ưu việt trong việc sử dụng cấu trúc shared memory bằng cách tạo ra nhiều thread chạy song song trên các nhân của CPU. Tuy vậy OpenMP không có chức năng giao tiếp node này với node khác. Vì vậy việc kết hợp MPI với OpenMP để viết những chương trình có thể chạy tốt hơn trên cluster là một việc làm thú vị. một chương trình như thế sẽ có kiểu làm việc như sau:

Hình 2[4]: hoạt động MPI và OpenMP trong cluster

Bản thân MPI và OpenMP đều có những ưu điểm và khuyết điểm. MPI cho phép schedule các task một cách tĩnh (static), và điều này giúp cho lập trình viên khống chế hoạt động của các task một cách có hiệu quả, trong khi OpenMP lại phân phát nhiệm vụ cho các thread một cách tự động, đem lại sự đơn giản hóa trong việc lập trình. Các hàm giao tiếp trong MPI được tối ưu hóa, cơ bản đảm bảo vấn đề đồng bộ, còn OpenMP lại đòi hỏi phải chú trọng đến vấn đề này. Thêm vào đó, ngược lại với OpenMP, việc giao tiếp trong MPI có thể kéo dài thời gian chạy của chương trình và có thể dẫn đến hiện tượng nút chai (bottleneck). MPI cũng không ghi điểm trong việc balancing, và scalability cũng rất kém. Việc sử dụng cùng lúc MPI và OpenMP trong một chương trình mang lại hi vọng sẽ tận dụng những ưu điểm của cả hai, đồng thời hạn chế những khuyết điểm vốn có của chúng.

Có thể có 3 kiểu code trong hybrid MPI&OpenMP như sau:1.Master only: các giao tiếp do thread chủ của OpenMP trên master node quản lí và đặt ngoài parallel regions, các threas khác idle trong quá trình giao tiếp. 2.Funneled: các giao tiếp do thread chủ của OpenMP trên master node quản lí nhưng có thể diễn ra trong parallel regions, các thread khác có thể làm việc khác trong quá trình giao tiếp. 3. Multiple: nhiều (hoặc tất cả) node giao tiếp với nhau.

Đoạn code sau như một ví dụ cho việc sử dụng MPI và OpenMP trong cùng một chương trình:

#include <mpi.h>

#include <omp.h>

#include <stdio.h>

int main (int nargs, char** args)

{

int rank, nprocs, thread_id, nthreads;

MPI_Init (&nargs, &args);

MPI_Comm_size (MPI_COMM_WORLD, &nprocs);

MPI_Comm_rank (MPI_COMM_WORLD, &rank);

#pragma omp parallel private(thread_id, nthreads)

{

thread_id = omp_get_thread_num ();

nthreads = omp_get_num_threads ();

printf(“I’m thread %d (out of %d) on MPI process %d (out of %d)\n”,

thread_id, nthreads, rank, nprocs);

}

MPI_Finalize ();

return 0;

}

Sử dụng Visual studio 2008 với các thiết lập như[5,6] và MPIRun Command là -np 2 “$(TargetPath)” > “$(OutDir)\out.txt”, tôi có kết quả sau(máy tôi có 1 con CPU 2 nhân):

I’m thread 1 (out of 2) on MPI process 0 (out of 2)

I’m thread 0 (out of 2) on MPI process 0 (out of 2)

I’m thread 1 (out of 2) on MPI process 1 (out of 2)

I’m thread 0 (out of 2) on MPI process 1 (out of 2)

Đáng lưu ý là, việc hybrid MPI&OpenMP không hẳn mang lại hiệu quả vượt trội hơn là sử dụng từng thứ. Hai hình sau cho thấy những kết quả khác nhau của việc sử dụng hybrid. Hình 3 cho thấy các hybrid không tốt hơn pure MPI trong khi hình 4 lại chứng tỏ thời gian chạy giảm dần cùng với sự giảm dần số process và tăng dần số thread. Do vậy, trước khi sử dụng MPI và OpenMP trên cùng một chương trình cần phân tích việc tận dụng những mặt nào, hạn chế những mặt nào của chúng, nhằm phán đoán lợi ích chương trình mang lại có bù lại được với overhead không.

Hình 3[7] Thời gian chạy của 1 ứng dụng tên là Jocobi kernel

Hình 4[7] Thời gian chạy của 1 ứng dụng tên là sPPM

Tham khảo

[1]Wikipedia. Computer cluster. http://en.wikipedia.org/wiki/Cluster_(computing)

[2] https://cat123vn.wordpress.com/2012/01/23/doi-dieu-ve-top500/

[3] Xing Cai. Programming with OpenMP and mixed MPI-OpenMP. http://heim.ifi.uio.no/˜xingca/notur2011-openmp-lecture.pdf

[4] Development of mixed mode MPI / OpenMP applications, L. Smith and M. Bull, Scientific Programming, Vol. 9, No 2-3, 2001, 83-98.

[5] https://cat123vn.wordpress.com/2012/01/02/ch%E1%BA%A1y-ch%C6%B0%C6%A1ng-trinh-mpi-v%E1%BB%9Bi-visual-studio-2008/

[6] https://cat123vn.wordpress.com/2012/02/19/ch%E1%BA%A1y-ch%C6%B0%C6%A1ng-trinh-openmp-v%E1%BB%9Bi-visual-studio-2008/

[7] Mixed mode programming. http://www.deisa.eu/news_press/training/Juelich2006/presentations/DEISA-Training-October06-Technical-04-Mixedmode.pdf

Categories: Programming Tags: ,
  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: