You are on page 1of 8

Cấu hình MPI SDK với Visual Studio để lập trình song song huu-tuan.nguye n@vimaru.e du.

vn

Hướng dẫn cài bộ MPI SDK của Microsoft để lập trình song song sử dụng MPI
với Visual Studio 2013 (cập nhật lần cuối ngày 23/09/2015).

Bước 1: Download bộ MPI SDK từ website của Microsoft:

+ MsMPISetup.exe (http://download.microsoft.com/download/6/4/A/64A7852A-
A8C3-476D-908C-30501F761DF3/MSMpiSetup.exe).

+ MsMPISDK.msi (http://download.microsoft.com/download/6/4/A/64A7852A-
A8C3-476D-908C-30501F761DF3/msmpisdk.msi).

Bước 2: Cài đặt bộ MPI SDK:

Chạy cả hai chương trình cài đặt trên, MPI SDK sẽ được cài vào thư mục C:\
Program Files (x86)\Microsoft SDKs\MPI và gồm thư viện (file .lib) và các file
include. Còn bộ MPI Setup sẽ được cài vào thư mục C:\Program Files\Microsoft
MPI.

Lưu ý: dịch vụ Windows Firewall phải được chạy thì mới cài được cả hai
chương trình trên suôn sẻ, sau khi cài xong có thể tắt dịch này. Để bật tắt dịch
vụ Windows Firewall ta chạy lệnh services.msc (Start->Run->services.msc).

Bước 3: Cấu hình MPI với Visual Studio

Mở một project Visual C++ bất kỳ nào, vào mục View->Property Manager, nhấp
chuột phải vào Microsoft.Cpp.Win32.user và chọn Properties như trong hình 1
sau:

Nguyễn Hữu Tuân, Khoa Công nghệ Thông tin – Đại học Hàng hải Việt Nam – vimaru.edu.vn
Cấu hình MPI SDK với Visual Studio để lập trình song song huu-tuan.nguye n@vimaru.e du.vn

Hình 1: Cấu hình cho các project C++ trong Visual Studio

Sau đó trong hộp thoại hiện ra, chọn mục VC++ Directories, thêm đường dẫn
“C:\Program Files (x86)\Microsoft SDKs\MPI\Include” vào mục Include
Directories và đường dẫn “C:\Program Files (x86)\Microsoft SDKs\MPI\Lib\
x64” vào mục Library Directories. Lưu ý có dấu “;” để phân biệt với các đường
dẫn khác, đây là đường dẫn để dịch các chương trình 64 bit, với các chương
trình 32 bit thì thay x64 ở trên bằng x86. Lưu ý đối với các bản VS 2010 hoặc
2012, ta phải nhấn chuột trái vào mục “Microsoft.Cpp.Win32.user” và chọn
“Save …” để lưu lại các thiết lập vừa thực hiện.

Sau bước này, ta có thể lập trình MPI với Visual Studio, tuy nhiên để chạy
chương
trình thì phải tiến hành thêm bước 4 dưới đây.

Bước 4: Thêm đường dẫn tới chương trình mpiexec.exe (C:\Program Files\
Microsoft MPI\Bin) vào đường dẫn PATH của hệ điều hành.

Nguyễn Hữu Tuân, Khoa Công nghệ Thông tin – Đại học Hàng hải Việt Nam – vimaru.edu.vn
Cấu hình MPI SDK với Visual Studio để lập trình song song huu-tuan.nguye n@vimaru.e du.vn

Bước 5: Chạy một chương trình MPI: ta chạy trên giao diện dòng lệnh (từ
command.com) và gõ lệnh:

mpiexec –np <số tiến trình> <tên chương trình MPI> <danh sách tham

số> Ví dụ 1: Cài đặt song song của thuật toán sắp xếp trộn

Viết chương trình cài đặt thuật toán sắp xếp một mảng các số nguyên bằng cách
sử dụng kỹ thuật lập trình song song và đánh giá hiệu năng (tốc độ thực
hiện) so với kỹ thuật lập trình tuyến tính. Thông thường hiệu năng sẽ tăng lên
số lần bằng số lần phân chia luồng hoặc tiến trình cho tới khi đạt tới ngưỡng
của phần cứng.

Thuật toán sắp xếp trộn (merge sort) là một thuật toán hoạt động theo chiến
lược chia để trị (divide and conquer): để thực hiện sắp xếp một mảng có n
phần tử, dữ liệu sắp xếp (mảng) sẽ được chia thành 2 nửa, hai nửa dữ liệu sau
đó được sắp xếp một cách riêng rẽ bằng một thuật toán tốt (O(n)=nlog(n)), cuối
cùng hai nửa đã sắp được trộn (merge) với nhau bằng một thuật toán có độ
phức tạp O(n) = n (tuyến tính). Trong trường hợp hai nửa dữ liệu được sắp xếp
bằng chính merge sort, ta có cài đặt đệ qui của thuật toán.

Để cài đặt song song thuật toán sắp xếp trộn với MPI, ta sẽ chia dữ liệu cần
trộn cho 2 tiến trình (process), tiến trình chủ (id=0) sẽ thực hiện sinh dữ liệu, chia
và gửi 1 nửa mảng cho tiến trình con (id=1). Sau đó cả hai tiến trình sẽ thực
hiện sắp xếp đồng thời (chạy song song), sau khi tiến trình thứ 2 (id=1) xong, dữ
liệu đã sắp xếp sẽ được gửi về cho tiến trình chủ (id=0), tiến trình chủ sẽ thực
hiện trộn hai nửa mảng đã sắp xếp để được mảng sắp xếp cuối cùng. Có thể
hình dung quá trình trên qua sơ đồ trong hình 2 sau:

Nguyễn Hữu Tuân, Khoa Công nghệ Thông tin – Đại học Hàng hải Việt Nam – vimaru.edu.vn
Cấu hình MPI SDK với Visual Studio để lập trình song song huu-tuan.nguye n@vimaru.e du.vn

Hình 2: Các bước sắp xếp trộn song

song Cụ thể cài đặt song song của merge sort sử dụng MPI

như sau:
#include <mpi.h>
#include <stdio.h>
#include
<algorithm> #include
<iostream> #include
<random>

using namespace std;

typedef std::mt19937

MyRNG;
int seed_val; // populate
somehow MyRNG rng;

void merge(int * a, int left, int mid, int right); //


tron void merge_sort(int * a, int left, int right); //
sap xep void print_out(int *a, int n); // in mang ra man
hinh void gen_data(int * a, int n); // sinh mang ngau
nhien

int n;
int a[800000], b[400000];

int main(int argc, char ** argv)


{
int rank;
int printout = 0; // khong in du lieu
Nguyễn Hữu Tuân, Khoa Công nghệ Thông tin – Đại học Hàng hải Việt Nam – vimaru.edu.vn
Cấu hình MPI SDK với Visual Studio để lập trình song song huu-tuan.nguye n@vimaru.e du.vn

if (argc == 3)
{
n = atoi(argv[1]); // so phan tu mang
printout = atoi(argv[2]); // co muon in ra man hinh (1-in)
}

Nguyễn Hữu Tuân, Khoa Công nghệ Thông tin – Đại học Hàng hải Việt Nam – vimaru.edu.vn
Cấu hình MPI SDK với Visual Studio để lập trình song song huu-tuan.nguye n@vimaru.e du.vn

else
n = 800000;
rng.seed(seed_val); // khoi tao bo sinh so ngau
nhien gen_data(a, n); // sinh mang ngau nhien

MPI_Init(&argc, &argv); // khoi tao MPI


MPI_Comm_rank(MPI_COMM_WORLD, &rank); // rank la processid
if (rank == 0) { // master process
if (printout)
{
cout << "Data before sorting:" <<
endl; print_out(a, n);
}
cout << endl;
double start_time = MPI_Wtime(); // tinh thoi gian

// gui du lieu cho slave process


MPI_Send(&a[n/2], n/2, MPI_INT, 1, 0, MPI_COMM_WORLD);

merge_sort(a, 0, (n/2)-1);

// nhan du lieu tu slave process


MPI_Recv(&a[n/2], n/2, MPI_INT, 1, 0,
MPI_COMM_WORLD, MPI_STATUS_IGNORE);
/* Serial: Merge array a and sorted part of array a
*/ merge(a, 0, (n/2)-1, n-1);
double end_time = MPI_Wtime(); // tinh thoi gian
cout << "Time is " << end_time - start_time <<
endl; if (printout)
{
cout << "Data after sorting:" << endl;
print_out(a, n);
}
}
else if (rank == 1) { // slave process
// nhan du lieu tu master process, luu vao mang b
MPI_Recv(b, n/2, MPI_INT, 0, 0,
MPI_COMM_WORLD, MPI_STATUS_IGNORE);
// sap xep du lieu: mang
b merge_sort(b, 0, (n/2)-
1);
// gui du lieu cho master process
MPI_Send(b, n/2, MPI_INT, 0, 0, MPI_COMM_WORLD);
}

MPI_Finalize(); // don dep cac tai nguyen MPI lien quan

Nguyễn Hữu Tuân, Khoa Công nghệ Thông tin – Đại học Hàng hải Việt Nam – vimaru.edu.vn
Cấu hình MPI SDK với Visual Studio để lập trình song song huu-tuan.nguye n@vimaru.e du.vn

return 0;
}

void merge(int *a, int left, int mid, int right)


{
// ham tron hai nua cua mang a
int *b = new int[right - left +
1]; int i, j, k;
for (i = left; i <= right; i++)
b[i - left] = a[i];
j = 0;
k = mid + 1 - left;
for (i = left; i <= right; i++)
if ((b[j] < b[k] && (j <= mid - left)) || (k == right + 1 -
left))
a[i] = b[j++];
else
a[i] = b[k++];
delete[] b;
}

void merge_sort(int *a, int left, int right)


{
// sap xep bang tron
int mid;
if (left >= right)
return;
mid = (left + right) / 2;
merge_sort(a, left, mid);
merge_sort(a, mid + 1,
right); merge(a, left, mid,
right);
}

void print_out(int *a, int n)


{
for (int i = 0; i < n; i++)
cout << a[i] << ", ";
}

void gen_data(int * a, int n)


{
std::uniform_int_distribution<int> uint_dist(0, 2 * n);
for (int i = 0; i < n; i++)
a[i] = uint_dist(rng);
}

Nguyễn Hữu Tuân, Khoa Công nghệ Thông tin – Đại học Hàng hải Việt Nam – vimaru.edu.vn
Cấu hình MPI SDK với Visual Studio để lập trình song song huu-tuan.nguye n@vimaru.e du.vn

Kết quả chạy chương trình được dịch với VS 2013 Update 4 trên máy laptop
Elitebook 6930p Duo Core 2.4 Ghz như sau:

Số phần tử Cài đặt tuyến tính Cài đặt song song


N
500000 0.142 0.079
600000 0.173 0.098
700000 0.201 0.115
800000 0.231 0.131
Bảng 1: So sánh thời gian thực hiện sắp xếp trộn

Có thể thấy trong Bảng 1 là thời gian sắp xếp song song (2 processes) nhanh gấp
đôi so với sắp xếp (cài đặt) tuần tự. Cũng cần lưu ý rằng phần cài đặt thuật
toán sắp xếp trộn tuyến tính ở trên không phải là cài đặt tối ưu, mà chỉ là một
cài đặt cơ bản để minh họa cho việc song song hóa thuật toán này bằng MPI.

Nguyễn Hữu Tuân, Khoa Công nghệ Thông tin – Đại học Hàng hải Việt Nam – vimaru.edu.vn

You might also like