Download as pdf or txt
Download as pdf or txt
You are on page 1of 12

CÁC PHƯƠNG PHÁP CÀI ĐẶT GIAO DIỆN LẬP TRÌNH SONG SONG OPENMP

TRÊN KIẾN TRÚC SỬ DỤNG BỘ NHỚ PHÂN TÁN

Đỗ Xuân Huyền1*, Hà Viết Hải2


1 Khoa Công nghệ Thông tin, Trường Đại học Khoa học – Đại học Huế
2 Trường Đại học Sư phạm – Đại học Huế
1 Email: doxuanhuyen@gmail.com
2 Email: haviethai@gmail.com

TÓM TẮT

MPI và OpenMP là hai giao diện lập trình ứng dụng được sử dụng rộng rãi để
phát triển các chương trình song song. MPI có ưu điểm là có hiệu năng cao nhưng
khó học và đòi hỏi nhiều công sức khi sử dụng, trong khi OpenMP rất đơn giản,
mạnh mẽ và dễ sử dụng. Tuy nhiên nhược điểm lớn nhất của OpenMP là chỉ mới
được cài đặt đầy đủ trên các kiến trúc bộ nhớ chia sẻ (shared-memory
architectures). Có nhiều nghiên cứu để cài đặt OpenMP trên kiến trúc bộ nhớ phân
tán (distributed-memory architectures) với những ưu nhược điểm khác nhau. Bài
viết này trình bày tổng quan cùng với nhận xét về các hướng cài đặt OpenMP trên
kiến trúc bộ nhớ phân tán.

Từ khóa: Lập trình song song, OpenMP, HPC, CAPE, MPI.

1. MỞ ĐẦU

MPI [1] là một giao diện lập trình ứng dụng (Application Programming
Interface - API) được phát triển từ khá lâu. MPI cung cấp một thư viện căn bản nhất
cho việc tổ chức một chương trình song song theo kiểu đa tiến trình. Chúng bao gồm
các câu lệnh để khởi tạo môi trường MPI, phân chia các xử lý vào các đoạn mã song
song, mỗi phần chạy trên một tiến trình (process); các câu lệnh để trao đổi dữ liệu giữa
các tiến trình; các câu lệnh đồng bộ hóa các tiến trình... Mô hình xử lý thường được
dùng là một tiến trình chính (master) và nhiều tiến trình phụ (slave). Thông thường,
tiến trình chính tại máy (hoặc CPU) nguyên thủy ban đầu, làm nhiệm vụ khởi tạo
chương trình, phân chia công việc và nhận kết quả tính toán từ các tiến trình phụ. Các
tiến trình phụ chạy ở các máy (hoặc CPU) phụ, mỗi tiến trình nhận dữ liệu ban đầu
tiến trình chính, thực hiện việc tính toán được giao và gửi kết quả về tiến trình chính.
Tuy có khả năng cung cấp hiệu năng cao và có thể chạy trên cả các kiến trúc sử dụng
bộ nhớ chia sẻ lẫn phân tán, nhưng các chương trình MPI đòi hỏi người lập trình phải
tự phân chia chương trình thành các khối cho tiến trình chính và phụ bằng các câu lệnh

1
tường minh. Các công việc khác như gửi và nhận dữ liệu, đồng bộ hóa tiến trình…
cũng cần được chỉ rõ bằng các câu lệnh và tham số cụ thể. Điều này gây khó khăn và
đòi hỏi nhiều công sức đối với người lập trình, thể hiện qua ba khía cạnh lớn. Thứ nhất
là MPI đòi hỏi phải tổ chức ngay từ đầu chương trình thành theo cấu trúc song song
trên mô hình master-slave, một việc phức tạp hơn nhiều so với việc tổ chức chương
trình tuần tự vốn quen thuộc với tư duy của đa số lập trình viên. Thứ hai là nếu MPI
được sử dụng để song song hoá các chương trình tuần tự thì vì nó phá vỡ nghiêm
trọng cấu trúc ban đầu của chương trình. Điều khó khăn thứ ba gây nên bởi sự rắc rối
của các câu lệnh MPI, với một loạt các tham số khá khó hiểu cho mỗi câu lệnh. Do ba
khó khăn vừa nêu, tuy có hiệu năng cao và đã cung cấp một cách thức lập trình trừu
tượng hóa nhưng MPI vẫn được xem là assembler của việc lập trình song song.

OpenMP [2] là một API cung cấp một mức trừu tượng hóa cao để viết các
chương trình song song cho các hệ thống tính toán hiệu năng cao (High Performance
Computing (HPC)) sử dụng bộ nhớ chia sẻ (như multicore, multiCPU). Nó bao gồm
một tập các biến môi trường, các chỉ thị và hàm, được xây dựng để hỗ trợ việc dễ dàng
biến một chương trình tuần tự trên ngôn ngữ cơ sở là C/C++ hoặc Fortran thành một
chương trình song song. OpenMP sử dụng mô hình thực hiện fork-join với cấu trúc
song song cơ sở là luồng tiến trình (thread). Do sử dụng cấu trúc cơ sở này nên mặc
nhiên mô hình bộ nhớ của OpenMP sử dụng là bộ nhớ chia sẻ (shared memory), trong
đó không gian nhớ được sử dụng chung giữa các thread. Để viết chương trình song
song với OpenMP, lập trình viên có thể bắt đầu bằng cách viết một chương trình tuần
tự trên ngôn ngữ gốc (C/C++ hoặc Fortran), sau đó từ từ thêm vào các chỉ thị (pragma)
của OpenMP để chỉ định những phần việc nào cần được thực hiện song song. Việc chia
sẻ và đồng bộ công việc, dữ liệu được tiến hành một cách ngầm định hoặc tường minh
qua các chỉ thị đơn giản. Nhờ đặc điểm này mà OpenMP trở nên dễ học, dễ sử dụng và
ít tốn công sức lập trình nhưng lại có thể cung cấp hiệu năng cao trên các kiến trúc sử
dụng bộ nhớ chia sẻ và đã trở thành chuẩn lập trình song song trên các kiến trúc này.
Tuy nhiên, hạn chế lớn nhất của OpenMP là chỉ mới được cài đặt một cách hoàn chỉnh
cho các kiến trúc sử dụng bộ nhớ chia sẻ do sự phức tạp của việc cài đặt tất cả các yêu
cầu của OpenMP trên các kiến trúc sử dụng bộ nhớ khác.
Hình 1 minh họa phần mã chương trình xử lý song nhân ma trận bằng MPI.
Chương trình bắt đầu bằng các câu lệnh khởi tạo môi trường MPI, sau đó là phần thực
hiện ở master và cuối cùng là phần cho slave. Các phần việc về phân chia và trao đổi
dữ liệu được thực hiện qua các câu lệnh MPI_Send và MPI_Receive khá phức tạp.
Trong khi đó, chương trình nhân ma trận sử dụng OpenMP được minh hoạ trong
Hình 2 thì chỉ cần thêm chỉ thị #pragma omp parallel for private(row, col,
ind) vào trước vòng lặp chính của đoạn mã nhân ma trận thì OpenMP tự động phân
chia công việc, dữ liệu và hợp nhất các kết quả của các nhánh xử lý song song.

#include<mpi.h>
...

2
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
numworkers = numtasks-1;
if (taskid == MASTER) { /******* master task ************/
...
/* send matrix data to the worker tasks */
averow = N/numworkers;
offset = 0;
for (dest=1; dest<=numworkers; dest++) {
rows = averow;
MPI_Send(&offset, 1, MPI_INT, dest, FROM_MASTER,
MPI_COMM_WORLD);
MPI_Send(&rows, 1, MPI_INT, dest, FROM_MASTER,
MPI_COMM_WORLD);
MPI_Send(&a[offset][0], rows*N, MPI_LONG, dest,
FROM_MASTER, MPI_COMM_WORLD);
MPI_Send(&b, N*N, MPI_LONG, dest, FROM_MASTER,
MPI_COMM_WORLD);
offset = offset + rows;
}
/* wait for results from all worker tasks */
for (i=1; i<=numworkers; i++) {
MPI_Recv(&offset, 1, MPI_INT, i, FROM_WORKER,
MPI_COMM_WORLD, &status);
MPI_Recv(&rows, 1, MPI_INT, i, FROM_WORKER,
MPI_COMM_WORLD, &status);
MPI_Recv(&c[offset][0], rows*N, MPI_LONG, i, FROM_WORKER,
MPI_COMM_WORLD, &status);
}
if (taskid > MASTER) { /********** worker task ************/
...
MPI_Recv(&offset, 1, MPI_INT, MASTER, FROM_MASTER,
MPI_COMM_WORLD, &status);
MPI_Recv(&rows, 1, MPI_INT, MASTER, FROM_MASTER, MPI_COMM_WORLD,
&status);
MPI_Recv(&a, rows*N, MPI_LONG, MASTER, FROM_MASTER,
MPI_COMM_WORLD, &status);
MPI_Recv(&b, N*, MPI_LONG, MASTER, FROM_MASTER, MPI_COMM_WORLD,
&status);
for (k=0; k<N; k++)
for (i=0; i<rows; i++)
for (j=0; j<N; j++)
c[i][k] += a[i][j] * b[j][k];
MPI_Send(&offset, 1, MPI_INT, MASTER, FROM_WORKER,
MPI_COMM_WORLD);
MPI_Send(&rows, 1, MPI_INT, MASTER, FROM_WORKER,
MPI_COMM_WORLD);
MPI_Send(&c, rows*N, MPI_LONG, MASTER, FROM_WORKER,
MPI_COMM_WORLD);
}

Hình 1. Đoạn mã chương trình nhân ma trận sử dụng MPI

#include <omp.h>

3
...
#pragma omp parallel for private(row, col, ind)
for(row = 0; row < N; row++){
for(col = 0; col < N; col++)
for(ind = 0; ind < N; ind++)
C[row][col] += A[row][ind] * B[ind][col];
}

Hình 2. Đoạn mã chương trình nhân ma trận sử dụng OpenMP

Với đặc điểm đơn giản, dễ học, dễ và ít tốn công sức lập trình nên OpenMP đã
nhanh chóng được sử dụng rộng rãi và trở thành chuẩn lập trình song song trên các
kiến trúc sử dụng bộ nhớ chia sẻ. Điều này cũng thúc đẩy nhiều nhóm nghiên cứu việc
cài đặt OpenMP trên hệ thống máy tính sử dụng bộ nhớ phân tán với các hướng nổi
bật nhất được giới thiệu trong phần 2 của bài báo này. Phần 3 là các đánh giá nhận xét
phân loại chúng và phần 4 sẽ trình bày kết luận và thảo luận hướng nghiên cứu tiếp
theo.
2. TỔNG HỢP CÁC CÔNG TRÌNH NGHIÊN CỨU NỔI BẬT LIÊN QUAN
2.1. Phương pháp sử dụng SSI làm bộ nhớ chung cho tất cả các thread

SSI (Single System Image) là một hệ thống các máy tính được liên kết với nhau
(ảo hóa) tạo thành một máy thống nhất với bộ nhớ chung. SSI cung cấp ở mức trừu
tượng một bộ nhớ chia sẻ trên kiến trúc vật lý bộ nhớ phân tán. Có nhiều giải pháp để
thực hiện tạo ra hệ thống SSI như Kerrighed [5] và OpenSSI [6]. Cài đặt OpenMP trên
kiến trúc SSI là tiếp cận mang tính trực quan nhất và có khả năng tương thích hoàn
toàn với chuẩn OpenMP. Tất cả cả các yếu tố của OpenMP như mô hình thực hiện,
phương thức quản lý bộ nhớ và cơ chế đồng bộ đều có thể dễ dạng cài đặt được. Tuy
nhiên nhược điểm chính của phương pháp này là hiệu suất không cao [5]. Việc truy
xuất mở rộng bộ nhớ trên máy tính khác có một một độ trễ nhất định đồng thời chúng
cũng yêu cầu cơ chế đồng bộ. Cả hai yếu tố này làm ảnh hưởng chung đến hiệu suất
của toàn chương trình. Hiện nay, cả Kerrighed [5] và OpenSSI [6] đều có version cập
nhật đến năm 2010.
2.2. Phương pháp ánh xạ một phần không gian nhớ của thread

Để giảm bớt ảnh hưởng của việc ánh xạ toàn bộ không gian nhớ của các thread
trên một vùng nhớ ảo chia sẽ chung, cách tiếp cận này chỉ ánh xạ một phần của vùng
nhớ cần thiết trên vùng nhớ chia sẽ (Distributed Shared Memory - DSM). Với cách này
thì việc đồng bộ dữ liệu chỉ thực hiện trên một phần vùng nhớ chia sẻ và do đó giảm
thiểu được thời gian truy cập lên các vùng nhớ còn lại. Vấn đề còn lại là làm thế nào để
chỉ định được các biến chia sẻ để ánh xạ lên vùng nhớ chia sẻ. Đã có một số công trình
nghiên cứu để giải quyết vấn đề này.
Cách tiếp cận đầu tiên được là mở rộng thêm API của OpenMP, chẳng hạn như
công cụ Cluster OpenMP của Intel [3] đã thêm các chỉ dẫn mới để chỉ định việc chia sẻ

4
dữ liệu. Các chỉ dẫn mới này sẽ được các thread sử dụng trong việc chia sẻ dữ liệu và
dĩ nhiên nó cũng chịu sử quản lý của DSM. Một số biến được chia sẻ tự động bởi trình
biên dịch (compiler) như việc cấp phát stack và truyền các tham trị chuẩn của các hàm
con. Một số biến cần phải chỉ định cụ thể tường minh, ví dụ như file-scope (như là biến
toàn cục) trong C và C++.

Cách tiếp cận khác là sử dụng mô hình SCASH, mô hình này được để xuất bởi
Mitsuhisa Sato và các cộng sự [7] trong đó sử dụng một trình kết hợp với trình biên
dịch chuyển đổi mã Omni [9] để chuyển chương trình OpenMP chuyển sang chương
trình mã C. Bản chất của SCASH là thư viện lệnh cho phép thực hiện truy cập bộ nhớ
từ xa như lệnh đọc ("shmem_get") hoặc lệnh ghi ("shmem_put"), với yêu cầu thư viện
SHMEM được cài đặt sẵn trên các máy tính sử dụng đã được kết nối mạng với nhau.
Trong mô hình này, không gian địa chỉ dùng chung phải được khai báo tường minh và
được cấp phát đầu tiên khi chạy chương trình. Để biên dịch một chương trình
OpenMP sang mô hình SCASH, chương trình dịch phải biên dịch mã cấp phát bộ nhớ
toàn cục sang vùng nhớ chia sẻ tại thời điểm chạy chương trình (run time). Mô hình
SCASH có thể tạo được hiệu quả cao cho chương trình OpenMP nếu dữ liệu cần thiết
của mỗi thread được tổ chức trên processor (bộ vi xử lý) của thread đang chạy (trên
cùng máy vật lý). Để tạo ra được môi trường như vậy, Omni mở rộng tập chỉ dẫn của
OpenMP để cho phép lập trình viên có thể chỉ định không gian địa chỉ vùng nhớ chia
sẻ và cần bổ sung thêm chỉ dẫn lặp đồng bộ để lập lịch đồng bộ dữ liệu của các thread
cần chia sẻ dữ liệu với nhau.
Để nâng hiệu năng theo phương pháp này, Mitsuhisa Sato và các cộng sự xây
dựng trình biên dịch chuyển đổi mã XcalableMP [8] sử dụng mảng phối hợp để trao
đổi dữ liệu giữa các nút. Bản chất việc trao đổi dữ liệu giữa các nút sử dụng thư viện
MPI với các hàm MPI_Get(), MPI_Put() và MPI_Accumulate(). Kết quả đánh giá
cho thấy hiệu năng cao tuy nhiên cần bổ sung thêm các chỉ dẫn riêng. Hiện này
phương pháp này đang tiếp tục phát triển theo hướng bổ sung thêm nhiều chỉ dẫn
riêng. Phiên bản XcalableMP đang cập nhật đến Version 1.2.1 xuất bản năm 2014.
2.3. Phương pháp sử dụng mô hình HLRC

Phương pháp này sử dụng mô hình HLRC (Home-based Lazy Release


Consistency) [4] để cài đặt mô hình đồng bộ trể (Relaxed Consistency) của OpenMP.
Mô hình HLRC sử dụng cơ chế đảm bảo đồng bộ đồng nhất giữa các nút. Bằng cách sử
dụng cơ chế trang nhớ ảo để phát hiện các truy cập đến bộ nhớ chia sẻ và những nội
dung cần được cập nhật trên các vùng nhớ ảo với sự hỗ trợ của giải pháp thiết bị phần
cứng InfiniBand [23]. Cụ thể là mỗi trang bộ nhớ trong hệ thống HLRC có một nút chủ
luôn giữ dữ liệu copy cập nhật nhất. Khi một xử lý cần truy cập đến một trang mà dữ
liệu nội bộ chưa được cập nhật mới nhất thì lập tức một bản dữ liệu copy từ nút chủ sẽ
được cập nhật ngay lập tức. Nhiều nút có quyền ghi vào một trang với cấu trúc tổ chức

5
dữ liệu cho phép kiểm soát được sự thay đổi dữ liệu của trang. Những thay đổi được
đồng bộ đến nút chủ.

Mặc dù việc sử dụng mô hình HLRC có thể giảm việc thực hiện truy cập đến
vùng bộ nhớ chia sẻ đem lại hiệu suất cao nhưng nó cũng gặp một số vấn đề khác. Đầu
tiên là việc khó để chỉ định tự động tất cả các biến chia sẻ vì OpenMP không yêu cầu
khai báo tường minh tất cả các biến chia sẻ. Thứ hai, làm thế nào để việc thực hiện chỉ
thị đồng bộ toàn bộ không nhớ flush và khởi tạo các biến chia sẻ với tốc độ cao nếu
không có sự hỗ trợ của phần cứng chuyên dụng. Đồng thời, việc giảm các mệnh đề và
tối thiểu hóa các chỉ thị tạo ra sự phức tạp hơn khi cài đặt OpenMP theo mô hình này.
2.4. Phương pháp kết hợp với MPI

Có một số nghiên cứu [10][11][12] thực hiện cài đặt OpenMP trên nền MPI với
mục đính kết hợp ưu điểm của cả OpenMP (tính cài đặt đơn giản) và MPI (hiệu năng
cao) trên hệ thống máy tính có bộ nhớ phân tán.
MPI sử dụng cơ chế bộ nhớ phân tán theo đó mỗi nút của hệ thống có một
không gian bộ nhớ riêng, không được chia sẻ với hệ thống khác. Trong chương trình
song song viết theo MPI, lập trình viên phải chỉ định tường minh việc chia sẻ dữ liệu
giữa các nút, trong khi đối với OpenMP tất cả các biến được chia sẻ được thực hiện
ngầm định.
Để giải quyết sự khác nhau này, các ý tưởng thực hiện theo phương pháp cài
đặt này biên dịch chương OpenMP ra chương trình MPI [10] [11] hoặc biên dịch ra
chương trình trình chạy C++ hoặc Fortran [12] bổ sung các chỉ dẫn giao tiếp của MPI.
Cả [10][11][12] đều sử dụng các chiến lược và thuật toán khác nhau để phân
tích tự động dữ liệu cần chia sẻ cũng như giải quyết mối quan hệ nơi gửi và nơi nhận.
Các cài đặt theo phương pháp này có đánh giá bước đầu cho kết quả hiệu năng cao.
Tuy nhiên, tất cả chúng đều chưa thể cài đặt được một cách tự động toàn bộ các chỉ thị
của OpenMP.
2.5. Phương pháp dựa trên Mảng toàn cục (Global Array - GA)

Một cài đặt OpenMP trên hệ thống máy tính sử dụng bộ nhớ phân tán bằng
cách sử dụng GA đã được L.Huang và các cộng sự giới thiệu [13][14][15]. GA [16] là
một thư viện được thiết kế để dùng cho tính toán song song trên hệ thống có bộ nhớ
phân tán. GA đơn giản hoá lập trình song song bằng cách cung cấp cho người dùng
khái niệm của bộ nhớ chia sẻ ảo cho các hệ thống bộ nhớ phân tán. Người lập trình có
thể viết chương trình song song trên hệ thống những hệ thống cluster, nếu cần sử
dụng biến chia sẻ trong chương trình, chỉ cần chia sẻ dữ liệu tầng trên mà không quan
tâm tổ chức ở mức vật lý bên dưới. Tuy nhiên, đối với việc viết chương trình song song
kiểu SPMD (Single Program, Multiple Data) thì tính phức tạp vẫn được giữ nguyên.
Những chương trình GA phân bố dữ liệu theo nhiều khối để phân cho các tiến trình.
Trước khi một đoạn mã được thực hiện, các dữ liệu cần thiết phải được thu thập từ các

6
tiến trình xử lý liên quan; các dữ liệu này được phân phối về lại các vị trí vật lý của các
tiến trình. GA thực hiện truyền dữ liệu dựa trên MPI. L. Huang và các cộng sự
[13][14][15] đã thực hiện hầu hết các chỉ thị của OpenMP, thư viện thường dùng và
môi trường biến được phiên dịch sang thư viện GA hoặc MPI ở mức mã nguồn, ngoại
trừ một số thiết lập động hoặc thay đổi số lượng thread, như các chỉ dẫn
omp_set_dynamic, omp_set_num_threads. Ý tưởng chung của phương pháp là biên
dịch OpenMP sang GA để khai báo tất cả các biến chia sẻ của chương trình OpenMP
vào mảng toàn cục của GA.

Kết quả thực nghiệm của mô hình này được mô tả trong [13][14][15] đem lại
hiệu suất cao. Tuy nhiên, hạn chế chính của mô hình này là việc phải yêu cầu chỉ định
tường minh biến chia sẻ, điều này làm ảnh hưởng đến ưu điểm nổi bật nhất của
OpenMP là tính đơn giản, dể học, không cần khai báo tường minh các biến chia sẻ.
2.6. Phương pháp CAPE (Checkpointing Aided Parallel Execution)

CAPE [17][18][19][20] là phương pháp cài đặt OpenMP dựa trên kỹ thuật Chụp
ảnh chương trình (Checkpointing). Chụp ảnh chương trình (hoặc tiến trình) [21] là kỹ
thuật chụp và lưu trữ trạng thái của một chương trình đang vận hành sao cho nó có
khả năng khôi phục lại trạng thái ở các thời điểm sau đó. Kỹ thuật chụp ảnh chương
trình được sử theo nhiều hướng khác nhau như gia tăng khả năng chịu lỗi của chương
trình theo mô hình rollback, di trú tiến trình, backup hệ thống… Kỹ thuật chụp ảnh
chương trình có thể được phân chia vào hai nhóm: chụp ảnh đầy đủ (Complete
Checkpointing) và chụp ảnh gia tăng (Incremental Checkpointing) [22]. Ở nhóm thứ
nhất, toàn bộ không gian nhớ của tiến trình và một số thông số hệ thống khác của nó
được chụp và lưu trữ cho mỗi ảnh của chương trình (Checkpoint). Đây là kiểu đơn
giản nhưng các ảnh có kích thước lớn và dễ có dư thừa dữ liệu đối với những ảnh chụp
liên tiếp nhau của chương trình. Ở nhóm thứ hai, mỗi ảnh của chương trình chỉ lưu lại
những phần không gian nhớ và thông số hệ thống của chương trình đã bị cập nhật kể
từ khi khởi tạo chương trình hoặc kể từ lần chụp ảnh trước. Để biết được những phần
bị cập nhật này, chương trình được chụp ảnh thường được giám sát và chụp ảnh bởi
một tiến trình chụp ảnh (checkpointer) chạy song song với nó. Trong kỹ thuật này, các
ảnh chương trình phải được chụp một cách kế tiếp nhau. Để phục vụ một cách tối ưu
cho CAPE, trong đó có yêu cầu chụp ảnh từng phần không liên tục của chương trình,
CAPE sử dụng kỹ thuật Chụp ảnh chương trình gia tăng rời rạc (Discontinuos
Incremental Checkpointing – DICKPT) [18][19]. Kỹ thuật này đặt cơ sở trên kỹ thuật
chụp ảnh chương trình gia tăng nói trên, với bổ sung khả năng chụp ảnh từng đoạn rời
rạc của một chương trình. Các phân tích và số liệu thực nghiệm đã chứng minh hiệu
suất cao của nó trong cả hai mặt là giảm kích thước ảnh chụp và giảm thời gian thực
hiện quá trình chụp ảnh. Trong [17] đã chứng minh CAPE có thể cài đặt tương thích
hoàn toàn với OpenMP.

7
CAPE sử dụng các ảnh chụp tiến trình để cài đặt mô hình fork-join của
OpenMP. Khởi đầu, chương trình được khởi tạo trên tất cả các nút trong đó có một nút
đảm nhận tiến trình chính (master) và các nút con thực hiện các tiến trình phụ (slaver).
Các đoạn mã tuần tự cũng được thực hiện như nhau trên tất cả các tiến trình của hệ
thống. Khi gặp một cấu trúc song song của OpenMP, tiến trình chính phân chia công
việc tới mỗi tiến trình phụ (fork) bằng cách gửi cho nó một ảnh chụp tiến trình gia
tăng. Lưu ý là ảnh chụp này có kích thước rất bé, thường là chỉ vài byte, do nó được
lấy chứa kết quả của việc thực hiện một số câu lệnh đơn giản và không làm thay đổi
nhiều không gian nhớ. Mỗi tiến trình phụ nhận ảnh chụp tiến trình, tích hợp nó vào
trong không gian nhớ của mình và khởi tạo quá trình chụp ảnh tiến trình DICKPT. Sau
đó tiến trình phụ thực hiện phần việc tính toán được giao và trích rút kết quả thực hiện
bằng một ảnh chụp tiến trình. Kết quả này được gửi về tiến trình chính, nơi nhận và tổ
hợp chúng lại, sau đó tích hợp vào trong không gian nhớ của nó, cũng như gửi lại cho
các tiến trình phụ để đồng bộ hóa không gian nhớ của tất cả các tiến trình, chuẩn bị cho
việc thực hiện các đoạn mã tiếp theo của chương trình (join). Sau bước này, không gian
nhớ của mỗi tiến trình đều đã có kết quả thực hiện của phần mã song song, vì thế,
chúng xem như đều đã thực hiện xong phần việc của đoạn mã này. Các kết quả so
sánh hiệu suất của CAPE với MPI thông qua phân tích lý thuyết cũng như thực
nghiệm đã chứng tỏ được về mặt hiệu suất thì CAPE hoàn toàn có khả năng so sánh
được với giải pháp có hiệu năng cao nhất là MPI. Mức độ tăng tốc gần như tuyến tính
với chiều tăng của số lượng nút tính toán. Tuy nhiên, đến thời điểm hiện tại, CAPE chỉ
mới cài đặt và thử nghiệm được một số chỉ thị của OpenMP. Những chỉ thị khác chỉ
mới được chứng minh về mặt lý thuyết là đã có thể cài đặt được. Đồng thời, đối với
những hệ thống máy tính sử dụng bộ xử lý đa lõi thì CAPE cũng chưa khai thác được
tối ưu khả năng của chúng.
3. TỔNG HỢP ĐÁNH GIÁ VỀ CÁC PHƯƠNG PHÁP CÀI ĐẶT OPENMP
TRÊN KIẾN TRÚC BỘ NHỚ PHÂN TÁN

Trong phần 2 đã giới thiệu nhiều phương pháp cài đặt OpenMP trên hệ thống
máy tính bộ nhớ phân tán. Chưa có phương pháp nào thành công trên cả hai mặt cài là
đặt hoàn chỉnh các chỉ thị của OpenMP và có hiệu năng cao. Cách tiếp cận SSI đã thành
công khi cài đặt được toàn bộ các chỉ thị của OpenMP tuy nhiên hiệu năng chưa cao.
Một số phương pháp khác đặt hiệu năng cao tuy nhiên chưa cài đặt xong các chỉ thị
của OpenMP hoặc các bổ sung thêm chỉ thị riêng. Bảng 1 hệ thống lại đặc điểm của
từng phương pháp.

Bảng 1. Tổng hợp so sánh các phương pháp cài đặt OpenMP trên kiến trúc bộ nhớ
phân tán

Số Phương pháp Nguyên lý Ưu điểm Các tồn tại cần


TT giải quyết

8
1 SSI Xây dựng bộ nhớ ảo toàn Cài đặt đầy Hiệu năng thấp
cục ánh xạ đến bộ nhớ đủ chỉ dẫn
vật lý phân tán của OpenMP

2 Cluster OpenMP Chỉ ánh xạ các biến chia Hiệu năng Sử dụng các chỉ
sẻ vào vùng nhớ chia sẻ cao thị riêng, khác
chung với OpenMP

3 SCASH, Chỉ ánh xạ các biến chia Hiệu năng Sử dụng các chỉ
sẻ vào vùng nhớ chia sẻ cao thị riêng khác
XcalableMP
chung với OpenMP

4 HLRC Sử dụng cơ chế trang nhớ Hiệu năng Cần hỗ trợ của
ảo để phát hiện các truy cao giải pháp phần
cập đến bộ nhớ chia sẻ cứng

5 Kết hợp với MPI Dịch các chỉ thị OpenMP Hiệu năng Chưa cài đặt
sang MPI cao được nhiều chỉ
thị của
OpenMP

6 GA Sử dụng mảng toàn cục Hiệu năng Chưa cài đặt


cao được việc tự
động chỉ định
biến chia sẻ

7 CAPE Sử dụng kỹ thuật chụp Hiệu năng Chưa cài đặt


ảnh tiến trình để tự động cao hoàn chỉnh tất
hoá mô hình thực hiện và cả các chỉ thị
Đã chứng
mô hình bộ nhớ của của OpenMP
minh trên lý
OpenMP
thuyết có thể Chưa khai thác
cài đặt được tối đa khả năng
toàn bộ chỉ đa luồng trên
dẫn của mỗi nút con
OpenMP

4. KẾT LUẬN VÀ THẢO LUẬN HƯỚNG NGHIÊN CỨU TIẾP THEO

Có nhiều phương pháp cài đặt OpenMP cho hệ thống máy tính sử dụng bộ nhớ
phân tán. Bài báo đã tổng hợp và nhận xét ưu nhược điểm một số phương pháp nổi
bật. Phương pháp ảo hóa bộ nhớ vật lý phân tán [5] thành bộ nhớ thống nhất cho hiệu
suất thấp. Phương pháp sử dụng mảng toàn cục [13] và phương pháp ánh xạ ảo hóa
một phần không gian nhớ của thread trên vùng nhớ chia sẻ [3][7][8] đem lại hiệu suất

9
cao tuy nhiên đòi hỏi phải bổ sung các chi dẫn riêng khác với OpenMP hoặc không tự
động chỉ định biến chia sẻ. Một phương pháp khác, sử dụng cơ chế trang bộ nhớ ảo để
phát hiện các truy cập đến bộ nhớ chia sẻ [4] và thực hiện đồng bộ trễ đem lại hiệu suất
cao tuy nhiên cần có sự hỗ trợ của phần cứng chuyên dụng và phức tạp khi sử dụng.
Các phương pháp kết hợp với MPI [10][11][12] chưa được cài đặt đầy đủ được tất cả
các chỉ thị của OpenMP. Phương pháp dựa trên kỹ thuật chụp ảnh tiến trình
[17][18][19][20] - CAPE là hướng hứa hẹn nhất vì có khả năng cung cấp hiệu suất cao
và có thể cài đặt được tất cả các chỉ thị của OpenMP. Tuy nhiên CAPE cần tiếp tục
được nghiên cứu và phát triển để cài đặt được tất cả các chỉ thị của OpenMP và khai
thác tốt hơn các hệ thống máy tính sử dụng bộ xử lý đa lõi.

TÀI LIỆU THAM KHẢO


[1] Message Passing Interface Forum (2015). MPI: A Message-Passing Interface Standard,
Version 3.1, http://mpi-forum.org/docs/mpi-3.1/mpi31-report.pdf.
[2] OpenMP Architecture Review Board (2015), OpenMP Application Programming Interface,
http://www.openmp.org/mp-documents/openmp-4.5.pdf, Version 4.5,
http://www.openmp.org/wp-content/uploads/openmp-4.5.pdf.
[3] Jay Hoeflinger (Intel) (2010). Cluster OpenMP* for Intel® Compilers,
https://software.intel.com/en-us/articles/cluster-openmp-for-intel-compilers.
[4] Jie Tao, Wolfgang Karl, Carsten Trinitis (2005). Implementing an OpenMP Execution
Environment on InfiniBand Clusters, In proceeding of the First International Workshop on
OpenMP (IWOMP 2005). Eugene, Oregon.
[5] Christine Morin, Renaud Lottiaux, Geoffroy Vallée, Pascal Gallard, Gaël Utard, R.
Badrinath and Louis Rilling (2003). Kerrighed: A Single System Image Cluster Op-erating
System for High Performance Computing, Euro-Par 2003 Parallel Pro-cessing, Klagenfurt,
Austria, vol 2790, pp. 1291–1294.
[6] Dự án OpenSSI, OpenSSI (Single System Image). Clusters for Linux, http://openssi.org/cgi-
bin/view?page=openssi.html, (truy cập 12/03/2017).
[7] Mitsuhisa Sato, Hiroshi Harada, Atsushi Hasegawa and Yutaka Ishikaw, Cluster-enabled
OpenMP: An OpenMP compiler for the SCASH software dis-tributed shared memory
system, Journal Scientific Programming, Volume 9 Issue 2,3 (2001).
[8] Jinpil Lee, Mitsuhisa Sato (2010). Implementation and Performance Evaluation of
XcalableMP: A Parallel Programming Language for Distributed Memory Systems, 39th
International Conference on Parallel Processing, ICPP Workshops 2010, San Diego,
California, USA.
[9] Omni Compiler Project. http://omni-compiler.org/, http://www.hpcs.cs.tsukuba.ac.jp/omni-
compiler/ (truy cập 12/03/2017).
[10] Ayon Basumallik and Rudolf Eigenmann (2005). Towards automatic translation of
OpenMP to MPI, Proceedings of the 19th annual international conference on
Supercomputing, Cambridge, MA, pp. 189–198.

10
[11] Albert Saa-Garriga, David Castells-Rufas, Jordi Carrabina (2015). OMP2MPI: Automatic
MPI code generation from OpenMP programs, Proceedings of the Workshop on High
Performance Energy Efficient Embedded Systems (HIP3ES) 2015. Amsterdam, January
21st. Collocated with HIPEAC 2015 Conference.
[12] Jacob A.C. et al. (2015) Exploiting Fine- and Coarse-Grained Parallelism Using a Directive
Based Approach. OpenMP: Heterogenous Execution and Data Movements. Lecture Notes
in Computer Science, vol 9342. Springer, Cham.
[13] Lei Huang and Barbara Chapman and Zhenying Liu (2005), Towards a more efficient
implementation of OpenMP for clusters via translation to Global Arrays, Journal of Parallel
Computing 31, pp 1114–1139.
[14] Lei Huang, Barbara Chapman, Zhenying Liu and Ricky Kendall. Efficient Translation of
OpenMP to Distributed Memory. Lecture Notes in Computer Science, 2004, Volume
3038/2004, 408-413.
[15] Lei Huang, Barbara Chapman and Ricky Kendall. OpenMP for Clusters. In the Fifth
European Workshop on OpenMP, EWOMP’03, Aachen, Germany, 2003.
[16] Global Arrays Programming Models (2017). Global Arrays Programming Models, Version
5.6, http://hpc.pnl.gov/globalarrays.
[17] Eric Renault (2007), Distributed Implementation of OpenMP Based on Checkpointing
Aided Parallel Execution, International Workshop on OpenMP (IWOMP), Beijing, China,
LNCS 4935, pp.183-193.
[18] Viet Hai Ha and Éric Renault (2011), Discontinous Incremental: A New Approach Towards
Extremely Lighweight Checkpoints, Proceedings of the IEEE Incremental Symposium on
Computer Networks and Distributed System 2011 (CNDS 2011), Tehran, Iran.
[19] Viet Hai Ha and Éric Renault, Improving Performance of CAPE using Discontinuous
Incremental Checkpointing, Proceedings of the International Conference on High
Performance and Communications 2011 (HPCC-2011), Banff, Canada (2011).
[20] Tran V.L., Renault É., Ha V.H. (2015) Improving the Reliability and the Performance of
CAPE by Using MPI for Data Exchange on Network. Lecture Notes in Computer Science,
Vol 9395. Springer, Cham.
[21] James S.Plank (1997). An Overview of Checkpointing in Uniprocessor and Distributed
Systems, Focusing on Implementation and Performance, Technical Report UT-CS-97-372,
University of Tennessee.
[22] S. YI, J. Heo, Y. Cho, J. Hong, J. Choi and G. Jeon (2004). Ickpt: An Efficient Incremental
Checkpointing Using Page Writing Fault - Focusing on the Implementation in Linux
Kernel. Proceedings of the ISCA 19th International Conference on Computers and Their
Applications (CATA04), Seattle, WA, pp. 209-212.
[23] InfiniBand Trade Association (2003). InfiniBand Architecture Specification, Volume 2,
Release 1.1.

11
THE METHODS INSTALLING OPENMP API ON DISTRIBUTED-MEMORY
ARCHITECTURES

Do Xuan Huyen1*, Ha Viet Hai2


1 University of Science - Hue University
2 University of Education - Hue University
1 Email: doxuanhuyen@gmail.com
2 Email: haviethai@gmail.com

ABSTRACT

MPI and OpenMP are two widely used API for developing parallel programs. MPI
has a high performance advantage but is difficult to use while OpenMP is easy to
apply. However, the most important drawback of OpenMP is that it is only
installed on shared memory architecture. This article aims at reviewing and
discussing the general, advantages and drawbacks of the researches, which focus
on installing OpenMP API on distributed memory architecture.

Keywords: OpenMP, Parallel Programming, High Performance Computing,


CAPE.

12

You might also like