Home > Programming > 6 hàm cơ bản của MPI

6 hàm cơ bản của MPI

Mặc dù MPI có rất nhiều hàm số (MPI-1 có 128 hàm số, MPI-2 có 287 hàm), tuy nhiên thực tế chỉ cần dùng 6 hàm cơ bản là có thể thực hiện đầy đủ tính năng của một chương trình MPI. Bài này nhằm giới thiệu cách dùng 6 hàm số này trong C/C++, các giải thích dưới đây đều từ góc độ của C/C++.

Cấu trúc 1 chương trình MPI như sau

Trong hình trên, chắc hẳn các bạn đã rất quen với phần header files và khai báo biến. Chương trình MPI chỉ thật sự bắt đầu (Begin) với việc gọi hàm int MPI_Init(int *argc, char ***argv) và kết thúc bằng hàm int MPI_Finalize(void). Hai hàm số thường dùng kế đến là:

int MPI_Comm_rank(MPI_Comm comm, int *rank): lưu số thứ tự của process trong comm vào trong biến rank. Bạn có thể hiểu MPI_Comm là một communicator-tập hợp các process, bảo đảm không gian giao tiếp của các process mà nó chứa. Có một communicator mặc định là MPI_COMM_WORLD chứa tất cả các process của chương trình MPI.

int MPI_Comm_size(MPI_Comm comm, int *size): lưu số lượng các process trong comm vào biến size.

Việc giao tiếp(communication) giữa các process sẽ được thực hiện bởi 2 hàm số sau:

MPI_SEND(buf,count,datatype,dest,tag,comm). Buf là địa chỉ bắt đầu của buffer chứa data cần gởi, count là số lượng các data trong buffer, datatype là kiểu data gởi đi, dest là số của process cần gởi tới, tag là kí hiệu cho data, và comm là communicator.

MPI_RECV(buf,count,datatype,source,tag,comm,status). Buf là địa chỉ bắt đầu của buffer chứa data đến, count là số lượng nhiều nhất các data mà process này có thể nhận, datatype là kiểu data nhận về, source là số của process gởi data đến, tag là kí hiệu cho data, comm là communicator và status là trạng thái của tin nhắn, trong status chứa nhiều thông tin hữu ích khác.

Như vậy, việc giao tiếp giữa các process hoàn toàn do programmer khống chế, dữ liệu từ process nào gởi đến process nào, số lượng bao nhiêu, kiểu dữ liệu gì đều được xác định trước. Tag trong 2 hàm số trên sẽ phát huy tác dụng trong trường hợp process A cùng một lúc gởi 2 data có cùng datatype đến process B, lúc này process B sẽ dựa vào tag để lưu dữ liệu vào đúng chỗ. Vậy khi nhận dữ liệu, process B sẽ kiểm tra cả source và tag của dữ liệu.

Chúng ta hãy xem ví dụ sau:

#include <stdio.h>

#include <mpi.h>

int main( int argc, char *argv[])

{

int rank, buf;

MPI_Status status;

MPI_Init(&argc, &argv);

MPI_Comm_rank( MPI_COMM_WORLD, &rank );

/* Process 0 sends and Process 1 receives */

if (rank == 0) {

buf = 123456;

MPI_Send( &buf, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);

}

else if (rank == 1) {

MPI_Recv( &buf, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status );

printf(“Received %d\n”, buf );

}

MPI_Finalize();

return 0;

}

Trong ví dụ trên, process 0 (rank==0) sẽ gởi số 12345 đến process 1, process 1 sau khi nhận được dữ liệu sẽ in ra màn hình. Tag của dữ liệu trong ví dụ trên là 0, tuy nhiên bạn cũng có thể thay bằng bất cứ số nguyên nào khác.

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: