Song song hoá là một giải pháp quan trọng được áp dụng khi giải quyết các vấn đề đòi hỏi phải tính toán lớn
Trang 1TÓM TẮT KHÓA LUẬN
Song song hóa là một giải pháp quan trọng được áp dụng khi giải quyết các vấn
đề đòi hỏi phải tính toán lớn thường gặp trong các lĩnh vực khoa học cơ bản…Bài toán body là một trong những bài toán cơ bản trong lĩnh vực vật lý học thiên thể, liên quan tới lực tương tác giữa các hạt với nhau trong không gian Có rất nhiều hướng để giải quyết bài toán trên, trong đó có phương pháp sử dụng thuật toán Barnes-Hut
N-OpenMP là giao diện lập trình ứng dụng API, cung cấp cho người lập trình một giao diện mềm dẻo, có tính khả chuyển trong khi phát triển các ứng dụng song song trên các máy tính sử dụng kiến trúc bộ nhớ chia sẻ
Khóa luận này giới thiệu tổng quan về bài toán N-body, thuật toán Barnes-Hut và giao diện lập trình ứng dụng OpenMP Trên cơ sở đó đánh giá hiệu năng thuật toán Barnes-Hut, tiến hành tìm hiểu, phân tích và đề xuất các phương thức song song hóa thuật toán Barnes-Hut với OpenMP
Trang 2LỜI CẢM ƠN
Đầu tiên, em muốn gửi lời cảm ơn sâu sắc nhất tới TS Nguyễn Hải Châu, người
đã hướng dẫn và chỉ bảo em tận tình trong suốt thời gian làm khóa luận
Em xin chân thành cảm ơn thầy Phạm Kỳ Anh, giám đốc Trung tâm Tính toán hiệu năng cao – Trường Đại học KHTN – Đại học Quốc gia Hà Nội, người đã tạo điều kiện tốt nhất cho em thực hành và thử nghiệm thuật toán
Em cũng xin gửi lời cảm ơn tới tất cả các thầy và các anh chị trong Trung tâm, những người đã giúp đỡ và trả lời mọi thắc mắc, tạo điều kiện cho em hoàn thành khóa luận
Em xin cảm ơn thầy Đoàn Minh Phương, giảng viên bộ môn Mạng và Truyền thông máy tính, khoa CNTT, trường Đại học Công nghệ, người đã giúp đỡ em thử nghiệm bài toán trên máy đa xử lý Intel
Cuối cùng, em xin gửi lời cảm ơn sâu sắc tới những người thân trong gia đình em, những người luôn quan tâm, động viên khích lệ em trong học tập và trong cuộc sống
Sinh viên thực hiện khóa luận
Lê Thị Lan Phương
Trang 3Danh sách hình vẽ
Hình 1: Minh họa hệ N-body trong không gian 2
Hình 2: Biểu diễn lực tổng hợp tác dụng lên 1 hạt 4
Hình 3: Quan sát thiên hà Andromeda từ trái đất 6
Hình 4: Biểu diễn quá trình đệ quy thay thế một cụm bởi tâm điểm 7
Hình 5: Cây Quadtree với 4 mức 8
Hình 6: Cây Octree với 2 mức 8
Hình 7: Biểu diễn cây sau khi loại bỏ các ô trống 9
Hình 8: Các thành phần trong OpenMP 15
Hình 9: Kiến trúc bộ nhớ chia sẻ 16
Hình 10: Mô hình Fork-Join 19
Hình 11: Minh họa vùng được song song hóa 21
Hình 12: Hình minh họa chỉ thị Do/for 24
Hình 13: Hình minh họa chỉ thị sections 26
Hình 14: Hình minh họa chỉ thị single 28
Hình 15: Cấu trúc dữ liệu cây trong treecode (1) 36
Hình 16: Cấu trúc dữ liệu cây trong treecode (2) 39
Trang 4Bảng từ viết tắt
Từ hoặc cụm từ Từ viết tắt Từ tiếng Anh
Giao diện lập trình ứng dụng API Application Program Interface Các chỉ thị mở dành cho đa
Giao diện truyền thông điệp MPI Message Passing Interface
Trang 5Mục lục
TÓM TẮT KHÓA LUẬN i
LỜI CẢM ƠN ii
Danh sách hình vẽ iii
Bảng từ viết tắt iv
Mục lục v
MỞ ĐẦU 1
Chương 1: BÀI TOÁN N-BODY VÀ THUẬT TOÁN BARNES-HUT 2
1.1 Bài toán N-body 2
1.1.1 Giới thiệu bài toán N-body 2
1.1.2 Phương pháp nhằm tăng tốc bài toán N-body 5
1.1.3 Cấu trúc cây Quadtree và Octree 7
1.2 Thuật toán Barnes-Hut 9
1.2.1 Mô tả thuật toán Barnes-Hut 10
Chương 2: GIỚI THIỆU VỀ OPENMP 15
2.1 OpenMP (Open specifications for Multi Processing) 15
2.2 Kiến trúc bộ nhớ chia sẻ 16
2.3 Mục tiêu của OpenMP 17
2.4 Môi trường hỗ trợ OpenMP 18
2.5 Mô hình lập trình OpenMP 18
2.6 Một số chỉ thị cơ bản trong OpenMP 19
2.6.1 Các chỉ thị song song hóa 20
2.6.2 Chỉ thị khai báo miền song song 20
2.6.3 Chỉ thị liên quan tới môi trường dữ liệu 21
2.6.4 Chỉ thị liên quan tới chia sẻ công việc 23
2.6.5 Chỉ thị đồng bộ hóa 28
2.6.6 Thư viện và một số biến môi trường 31
Trang 62.7 Ví dụ về lập trình song song với OpenMP 33
2.7.1 omp_hello.c 33
2.7.2 Cách biên dịch 33
2.7.3 Kết quả 34
Chương 3: SONG SONG HÓA THUẬT TOÁN BARNES-HUT 35
3.1 Treecode 35
3.1.1 Cấu trúc dữ liệu của cây 35
3.1.2 Các biến toàn cục 39
3.2 Thử nghiệm và đánh giá hiệu năng của treecode 40
3.2.1 Thử nghiệm chương trình treecode 40
3.2.2 Đánh giá hiệu năng 42
3.3 Song song hóa treecode với OpenMP 43
3.3.1 Môi trường thực hiện song song 43
3.3.2 Thực hiện song song 44
3.4 Kết quả thực nghiệm 51
KẾT LUẬN 53
TÀI LIỆU THAM KHẢO 54
Trang 7MỞ ĐẦU
Bài toán N-body là một trong những bài toán cơ bản của vật lý học thiên thể Trước đây đã có rất nhiều hướng khác nhau khi giải quyết vấn đề liên quan tới lực tương tác giữa các hạt của hệ N hạt trong không gian Trong đó có hai cách giải quyết cơ bản
Đó là tính trực tiếp lực giữa các cặp hạt với độ phức tạp là O (N2) và cách tính thế năng lặp với độ phức tạp là O (N log N) Cách thứ nhất cho phép tính toán một cách gần chính xác lực tương tác Song thời gian cần để thực hiện trong bài toán N-body là rất lớn, xấp xỉ
O (N2) với N là số hạt Trong đó thời gian tính lực chiếm chủ yếu, khoảng 96 % thời gian thực hiện chương trình khi được thử nghiệm trên máy Intel 1 CPU Cách thứ hai dường như giảm thiểu thời gian tính toán nhưng lại thiếu độ chính xác và thiếu tính tổng quát khi
mô phỏng hệ N-body
Thuật toán Barnes-Hut và các cải tiến của nó đã được áp dụng để tính lực với độ phức tạp xấp xỉ O (N log N) và cho kết quả tương đối chính xác Song song hóa thuật toán Barnes-Hut có ý nghĩa vô cùng quan trọng trong việc tăng tốc bài toán N-body
Song song hóa thuật toán Barnes-Hut trên kiến trúc máy tính có bộ nhớ phân tán bằng cách sử dụng giao diện lập trình ứng dụng MPI đã được nhiều tác giả nghiên cứu và đạt kết quả tốt Tuy nhiên vấn đề song song hóa thuật toán này trên kiến trúc máy tính đa
xử lý bộ nhớ chia sẻ chưa được nghiên cứu nhiều
OpenMP là một trong các giao diện lập trình ứng dụng dành cho các ứng dụng song song trên kiến trúc máy tính đa xử lý bộ nhớ chia sẻ So với MPI, OpenMP có tính mềm dẻo, tính khả chuyển cao, và cho phép người lập trình có được một giao diện đơn giản khi xây dựng và phát triển các ứng dụng song song
Khóa luận này nghiên cứu tổng quan về bài toán N-body, tìm hiểu về thuật toán Barnes-Hut cũng như về giao diện lập trình OpenMP Từ đó rút ra những nhận xét và đánh giá hiệu năng thuật toán và nghiên cứu vấn đề song song hóa thuật toán Barnes-Hut
sử dụng OpenMP trên mô hình bộ nhớ chia sẻ
Trang 8Chương 1: BÀI TOÁN N-BODY VÀ THUẬT TOÁN
BARNES-HUT
1.1 Bài toán N-body
1.1.1 Giới thiệu bài toán N-body
Bài toán N-body về thực chất là bài toán liên quan tới tính lực tương tác giữa các hạt trong không gian Các mô phỏng của bài toán N-body đóng vai trò quan trọng trong nhiều ứng dụng của vật lý học thiên thể, động lực học phân tử, và các phương pháp tính lưu lượng của gió xoáy (vortex flow methods)…
Xét hệ N hạt trong không gian Giữa các hạt có tương tác lực hấp dẫn Vì có N hạt, nên mỗi hạt sẽ chịu tác dụng của N-1 lực khác nhau gây ra bởi các hạt còn lại, lực tổng hợp của N-1 lực này sẽ làm thay đổi vận tốc và vị trí của hạt đó
Hình 1: Minh họa hệ N-body trong không gian
Dưới đây là giải thuật cơ bản khi mô phỏng hệ N-body
while (t < tfinal)
{
Trang 9for i =1 to n do {
tính lực f(i) tác dụng lên hạt i
cập nhật vận tốc và vị trí của hạt i }
t = t + ∆t }
Trong đó lực f(i) tác dụng lên hạt i có thể được tính đơn giản như sau:
• ma, mb: khối lượng của hạt a, b tương ứng
• d: khoảng cách giữa hai hạt
Trang 10Khi đó gia tốc của hạt là:
Lực tổng hợp tác dụng lên hạt a là: Fnet
Hình 2: Biểu diễn lực tổng hợp tác dụng lên 1 hạt
Xét các thời điểm t0,t1, … với khoảng thời gian là δt Dưới tác dụng của lực Fnet, vận tốc của hạt là:
Khi đó vị trí của hạt theo trục x là:
Trong không gian 3 chiều, khoảng cách giữa hai hạt a, b là:
Lực hấp dẫn chiếu lên trục Ox là:
Như vậy, bài toán N-body có thể đơn giản như sau:
Trang 111.1.2 Phương pháp nhằm tăng tốc bài toán N-body
Trước đây, bài toán N-body đã được mô hình hoá bằng cách tích hợp trực tiếp, trong đó ta tính lực tương tác theo từng cặp hạt, giống như mô tả ở phần trên Cách này đã
mô tả gần chính xác trạng thái động lực học của hệ N hạt nhưng độ phức tạp là O(N2) Cũng có thể mô phỏng hạt bằng phương pháp thế năng lặp, độ phức tạp chỉ còn là O(NlogN) nhưng lại thiếu tính chính xác và thiếu tính tổng quát của bài toán
Như vậy vấn đề đặt ra là làm thế nào vừa giảm thiểu độ phức tạp của thuật toán nhưng lại mô phỏng được một cách tương đối chính xác và có tính tổng quát của hệ thống
N hạt trong không gian?
Ta xét một ví dụ thực tế dưới đây
Giả sử cần phải tính lực hấp dẫn của trái đất tác dụng lên các vì sao và các hành tinh Quan sát bằng mắt thường, ta thấy nhiều điểm sáng trông giống như là một ngôi sao đơn lẻ, nhưng thực chất đó là một chòm sao (Ví dụ chòm sao tinh nữ Andromeda), bao gồm hàng tỉ các vì sao con Nhưng vì chúng xuất hiện rất gần nhau, nên tưởng như chúng
là một điểm sáng đơn
Xét D là kích thước của khối hộp bao quanh chòm sao Andromeda
Xét r là khoảng cách từ tâm khối tới trái đất
Trang 12Thiết lập tỉ số:
D/r =
Ta thấy tỉ số D/r là rất nhỏ, do vậy có thể thay thế một cách tương đối chính xác tất cả các vì sao trong chòm sao Andromeda như một điểm x đặt tại tâm của khối
Hình 3: Quan sát thiên hà Andromeda từ trái đất
Ý tưởng này đã được các nhà bác học trước phát hiện và áp dụng vào nhiều bài toán Như trong lý thuyết cơ học cổ điển, khi tính lực hút của trái đất tác dụng lên quả táo đang rơi, Newton đã coi trái đất như là một điểm được đặt tại tâm của trái đất
Điểm mới mẻ ở đây là việc ta áp dụng ý tưởng này một cách đệ quy để giải quyết bài toán N-body Chẳng hạn khi ta quan sát từ chòm sao tinh nữ Andromeda, dải ngân hà Milky Way có thể được xấp xỉ là một điểm đặt tại tâm dải Nhưng điều quan trọng hơn là quá trình này có thể được lặp lại nhiều lần miễn là tỉ số khoảng cách D1/r1 là đủ nhỏ để
có thể thay thế các vì sao trong một khối nhỏ hơn bằng một điểm đặt tại tâm khối khi tính lực hấp dẫn
Kích thước khối hộp Khoảng cách từ tâm khối tới trái đất
Trang 13Hình 4: Biểu diễn quá trình đệ quy thay thế một cụm bởi tâm điểm
Để quá trình đệ quy khi chia nhỏ không gian trở nên đơn giản, người ta sử dụng một cấu trúc dữ liệu đặc biệt Đó là cấu trúc cây Quadtree và Octree
1.1.3 Cấu trúc cây Quadtree và Octree
Cấu trúc cây Quadtree (dùng trong không gian 2 chiều) và Octree (trong không gian 3 chiều) là các cấu trúc dữ liệu được sử dụng để chia nhỏ không gian Để đơn giản, ta xét mô hình cây Quadtree (tương tự với xây dựng cây Octree)
Cây Quadtree bắt đầu bởi một hình vuông trong mặt phẳng Hình vuông lớn này được chia thành 4 hình vuông nhỏ Mỗi hình vuông nhỏ lại được chia ra làm 4 Quá trình phân chia này cứ tiếp tục được diễn ra…
Hình dưới đây mô tả một cây Quadtree với 4 mức
Trang 14Hình 5: Cây Quadtree với 4 mức
Mỗi nút (node) của cây tương ứng có 4 con (children), là 4 ô vuông nhỏ vừa mới được tạo thành từ việc phân chia ô vuông lớn hơn trước đó
Với cây Octree, quá trình diễn ra tương tự Nhưng thay vì mỗi nút có 4 con (như trong Quadtree), mỗi nút của cây Octree có 8 con
Dưới đây là hình mô tả một cây Octree với 2 mức chia
Hình 6: Cây Octree với 2 mức
Các lá của cây Quadtree lưu thông tin về vị trí, khối lượng của các hạt tương ứng
có trong hộp
Tuy nhiên, nếu như phân bố các hạt trong không gian không đồng đều thì việc phân chia như trên sẽ khiến cho nhiều lá của cây là rỗng Do vậy, việc lưu trữ các lá rỗng
Trang 15như thế rất lãng phí Để khắc phục tình trạng trên, người ta chỉ tiến hành phân chia các ô vuông chỉ khi chúng có chứa nhiều hơn một hạt
Ta có cấu trúc cây có dạng như sau
Hình 7: Biểu diễn cây sau khi loại bỏ các ô trống 1.2 Thuật toán Barnes-Hut
Thuật toán Barnes-Hut được giới thiệu lần đầu trong bài báo “A hierachical O(n logn) force caculation algorithm” vào tháng 12/1986 Tuy độ chính xác không bằng thuật toán FMM (Fast Mutipole Method), nhưng tốc độ tính toán lại nhanh hơn Thuật toán Barnes-Hut được sử dụng khá rộng rãi trong lĩnh vực vật lý học thiên thể
Dựa trên nền tảng mà Barnes-Hut đưa ra, đã có rất nhiều cải tiến và phát triển mới của thuật toán như việc áp dụng tính lực trên các máy tính vector (Barnes 1990), giải thuật Greengard 1990, J Makino với “Treecode with a special-purpose processor”, Publ Astron Soc Japan 43 (1991) 621 638… Các cải tiến mới này nhằm tăng độ chính xác, tăng tốc độ khi tiến hành song song hóa và có thể cải tiến để cài đặt trên các máy tính chuyên dụng GRAPE
Trang 161.2.1 Mô tả thuật toán Barnes-Hut
Thuật toán Barnes-Hut sử dụng chiến thuật chia để trị nhằm tìm ra cụm các hạt trong bài toán N-body Giả sử tất cả các hạt nằm trong 1 hình khối 3 chiều Cây octree được xây dựng một cách đệ quy bằng cách chia nhỏ hình khối thành 8 cell nhỏ hơn Loại
bỏ các cell không chứa hạt nào Lá của cây là các cell chỉ chứa một hạt duy nhất Quá trình chia nhỏ khối được lặp lại cho đến khi các khối chỉ chứa duy nhất một hạt
Để đơn giản, ta xét thuật toán Barnes-Hut trong không gian 2 chiều dưới đây Như vậy, thuật toán có thể được mô tả qua 3 bước như sau:
Bước 1: Xây dựng cây Quadtree
Bước 2: Đối với mỗi ô vuông của cây, tính tâm khối và tổng khối lượng các hạt
thủ tục này để thêm hạt i vào nút n trong cây
khi xây dựng cây, chú ý mỗi lá trong cây chỉ chứa
1 hoặc 0 hạt
If cây con có gốc tại n chứa nhiều hơn 1 hạt
Lựa chọn con c của n để thêm hạt i
Trang 17QuadInsert(i,c)
else if cây con có gốc tại n chứa đúng 1 hạt
Chuyển hạt có trong n sang một ô con
tính tâm khối và tổng khối lượng các hạt cho mỗi ô
( mass, cm ) = Compute_Mass(root) cm = tâm khối
function ( mass, cm ) = Compute_Mass(n)
Tính khối lượng và tâm khối
cho tất cả các hạt có trong cây con gốc là n
if n chứa 1 hạt
store ( mass, cm ) at n
return ( mass, cm )
else
for các con c(i) của n (i=1,2,3,4)
( mass(i), cm(i) ) = Compute_Mass(c(i))
end for
mass = mass(1) + mass(2) + mass(3) + mass(4)
cm = ( mass(1)*cm(1) + mass(2)*cm(2)
Trang 18+ mass(3)*cm(3) + mass(4)*cm(4)) / mass store ( mass, cm ) at n
Nếu tỉ số D/r là đủ nhỏ, ta có thể tính lực gây ra bởi các hạt trong hộp bằng cách
sử dụng khối lượng và vị trí tâm khối trong hộp Giả sử θ (theta) là ngưỡng (góc mở) cần tính toán (thông thường 0 < θ <= 1)
Nếu D/r < θ, ta tính lực hấp dẫn tác dụng lên các hạt như sau
• (x, y, z) là vị trí của hạt trong không gian 3 chiều
• m là khối lượng của hạt
• (xcm, ycm, zcm) là vị trí của tâm hạt trong hộp
• mcm là tổng khối lượng các hạt có trong hộp
• G là hằng số hấp dẫn Khi đó lực hấp dẫn sẽ được tính theo công thức xấp xỉ là:
Trang 19với mỗi hạt, duyệt cây để tính lực tác dụng lên nó
r = khoảng cách từ hạt i tới tâm khối tại n
D = kích thước của cell n
Qua thuật toán trên ta nhận thấy: quá trình duyệt cây để tính lực tác dụng lên hạt
là độc lập đối với mỗi hạt Bởi vậy có thể tiến hành song song hóa quá trình này để nhằm tăng tốc bài toán N-body
Trang 20Hiện nay, đã có rất nhiều giải thuật nhằm song song hóa quá trình tính toán lực tác dụng trong hệ thống N-body Có hai hướng để tiến hành song song hóa thuật toán
1) Song song hóa với MPI - sử dụng bộ nhớ phân tán
2) Song song hóa với OpenMP - sử dụng bộ nhớ chia sẻ
Trong khóa luận này, ta sẽ xem xét phương pháp song song hóa thuật toán Barnes-Hut với OpenMP
Trang 21Chương 2: GIỚI THIỆU VỀ OPENMP
2.1 OpenMP (Open specifications for Multi Processing)
Lập trình song song trên các máy với bộ nhớ chia sẻ đóng vai trò khá quan trọng trong tính toán hiệu năng cao Tuy nhiên việc sử dụng những tiện ích của hệ thống bộ nhớ chia sẻ là không dễ dàng đối với người lập trình Giao diện truyền thông điệp MPI phần lớn được sử dụng trong các hệ thống bộ nhớ phân tán Khả năng mở rộng và tính khả chuyển trong MPI là rất tốt, nhưng nó lại không có ý nghĩa khi triển khai với những đoạn
mã viết cho các máy tính tuần tự Hơn nữa MPI lại không tận dụng được những tiện ích
mà hệ thống bộ nhớ chia sẻ mang lại Trong nhiều năm, có nhiều sản phẩm được giới thiệu nhằm đưa ra tính khả chuyển và hiệu năng cao trên những hệ thống cụ thể Tuy nhiên vẫn phát sinh những vấn đề trong tính khả chuyển khi sử dụng các sản phẩm này
OpenMP được coi như một giao diện lập trình ứng dụng API (Application Program Interface) chuẩn dành cho lập trình với bộ nhớ chia sẻ OpenMP là sự kết hợp của các chỉ thị biên dịch, các hàm thư viện, và các biến môi trường được sử dụng để xác định phần thực hiện song song trên bộ nhớ chia sẻ trong lập trình Fortran hoặc C/C++ OpenMP đưa ra một mô hình lập trình song song có tính khả chuyển đối với những kiến trúc bộ nhớ chia sẻ đối với các nhà cung cấp khác nhau
Hình 8: Các thành phần trong OpenMP
Trang 222.2 Kiến trúc bộ nhớ chia sẻ
Hệ thống bộ nhớ chia sẻ bao gồm nhiều bộ xử lý CPU, mỗi bộ xử lý truy cập tới
bộ nhớ chung thông qua các siêu kết nối hoặc các đường bus Việc sử dụng không gian địa chỉ đơn làm cho mỗi bộ xử lý đều có một cái nhìn giống nhau về bộ nhớ được sử dụng Truyền thông trong hệ thống bộ nhớ chia sẻ thông qua cách đọc và ghi dữ liệu giữa các bộ xử lý với nhau lên bộ nhớ Với cách này, thời gian truy cập tới các phần dữ liệu là như nhau, vì tất cả các quá trình truyền thông đều thông qua đường bus
Ưu điểm của kiến trúc này là dễ dàng lập trình, bởi vì không có một sự truyền thông chính tắc bắt buộc nào giữa các bộ xử lý với nhau, chúng chỉ đơn giản là truy cập tới bộ nhớ chung Điều khiển quá trình truy cập tới bộ nhớ chung thông qua các kỹ thuật được phát triển trong các máy tính đa nhiệm, như kỹ thuật semaphores…
Để tránh tình trạng thắt nút cổ chai, gây ra bởi việc nhiều bộ xử lý truy cập tới cùng một vị trí trong bộ nhớ, người ta chia bộ nhớ chung thành các module Mỗi module nhớ được kết nối với một bộ xử lý thông qua một mạng chuyển mạch hiệu năng cao
Hình 9: Kiến trúc bộ nhớ chia sẻ
Trang 23Một số ví dụ về các máy tính bộ nhớ chia sẻ:
• SGI Origin2000: là sự kết hợp hiệu quả giữa kiến trúc bộ nhớ chia sẻ và
bộ nhớ phân tán Bộ nhớ được phân tán về mặt vật lý giữa các nút, với 2
bộ xử lý tại mỗi nút Quyền truy cập tới bộ nhớ cục bộ của các bộ xử lý tại các nút là như nhau Xét theo khía cạnh kiến trúc chia sẻ, tất cả các nút đều có quyền truy cập giống nhau tới bộ nhớ phân tán vật lý (http://www.cray.com/products/systems/origin2000)
• Sun HPC servers, như Enterprise 3000 (gồm từ 1 đến 6 bộ xử lý) hoặc Enterprise 10000 (gồm 4 đến 64 bộ xử lý)
2.3 Mục tiêu của OpenMP
• Cung cấp giao diện chuẩn: OpenMP đưa ra một giao diện chuẩn cho các hệ thống máy tính bộ nhớ chia sẻ
• Tính đơn giản: bao gồm tập các chỉ thị đơn giản và dễ sử dụng cho lập trình trên hệ thống máy tính bộ nhớ chia sẻ Một chương trình song song hóa có thể chỉ cần sử dụng 3 hoặc 4 chỉ thị biên dịch
• Tính dễ sử dụng:
o Khả năng để thực hiện song song cho các chương trình tuần tự
o Khả năng thực hiện song song hóa ở mức thô sơ, hoặc mức chi tiết
• Tính khả chuyển: hỗ trợ Fortran, C, C++
Trang 242.4 Môi trường hỗ trợ OpenMP
Qua tìm hiểu, ta thấy OpenMP là một mô hình lập trình ứng dụng song song dựa trên nền tảng của kiến trúc bộ nhớ chia sẻ, có tính khả chuyển và có thể mở rộng, giúp cho người lập trình có được một giao diện đơn giản và mềm dẻo khi xây dựng ứng dụng
OpenMP được xây dựng dựa trên sự hợp tác của các tập đoàn:
• Digital Equipment Corp (http://www.digital.com/info/hpc/)
• IBM (http://www.ibm.com/)
• Intel Corporation (http://www.intel.com/)
• Kuck & Associates Inc (http://www.kai.com/)
• Silicon Graphics Inc (http://www.sgi.com/Technology/OpenMP/) Ngày nay nhiều hãng phần cứng, phần mềm và các nhà phát triển ứng dụng chính đều đang xác nhận tính năng của OpenMP Xem chi tiết tại website
http://www.openmp.org để cập nhật thông tin cũng như các phiên bản, các chuẩn dành cho OpenMP
Ví dụ về một vài trình biên dịch có hỗ trợ OpenMP:
• Absoft Pro FortranMP 6.0 (http://www.absoft.com/pro.win.html)
• IBM XL Fortran (http://www.software.ibm.com/ad/fortran/xlfortran/)
• KAI KAP/Pro Toolset (http://www.kai.com/kpts/_index.html)
2.5 Mô hình lập trình OpenMP
OpenMP dựa trên việc sử dụng số lượng các luồng hiện có trong lập trình song song bộ nhớ chia sẻ Đó là một mô hình lập trình chính tắc, cung cấp đầy đủ các điều khiển cho người lập trình
Có thể xem mô hình lập trình OpenMP như là một mô hình Fork-Join
Trang 25Hình 10: Mô hình Fork-Join
Trong mô hình Fork-Join, tất cả các chương trình OpenMP đều bắt đầu bởi một tiến trình đơn Đó là master thread (luồng chính) Luồng chính này được thực hiện tuần tự cho đến khi gặp chỉ thị khai báo vùng cần song song hóa
Fork: sau khi gặp chỉ thị khai báo song song, master thread sẽ tạo ra một nhóm
các luồng song song Khi đó, các câu lệnh trong vùng được khai báo song song sẽ được thực hiện song song hóa trên nhóm các luồng vừa được tạo
Join: khi các luồng đã thực hiện xong nhiệm vụ của mình, chúng sẽ tiến hành quá
trình đồng bộ hóa, ngắt luồng, và chỉ để lại 1 luồng duy nhất là master thread
2.6 Một số chỉ thị cơ bản trong OpenMP
Kỹ thuật để song song hóa đoạn code chính là các chỉ thị biên dịch Chỉ thị biên dịch được thêm vào mã nguồn, để chỉ ra phần nào được tiến hành song song trên hệ thống
bộ nhớ chia sẻ Cùng với đó là một số chỉ thị đặc biệt chỉ ra phương thức song song hóa như thế nào? Ưu điểm của kỹ thuật này là dễ sử dụng và có tính khả chuyển đối với hệ thống các máy tính tuần tự và máy tính đa xử lý Bởi vì đối với các trình biên dịch tuần
tự, những chỉ thị này được coi như là các comment
Trang 26f77: !$OMP PARALLEL f77: call work(x,y)
f77: !$OMP END PARALLEL
2.6.1 Các chỉ thị song song hóa
Các chỉ thị song song hóa được thêm vào mã nguồn có cấu trúc như sau
Cấu trúc:
#pragma omp directive_name [clauses] <new_line>
Chú ý: cuối các chỉ thị song song đều phải xuống dòng
2.6.2 Chỉ thị khai báo miền song song
Chỉ thị này xác định vùng cần tiến hành song song hóa Khi một thread bắt gặp chỉ thị khai báo miền cần song song, nó sẽ tạo ra một nhóm các thread khác nhau, đồng thời trở thành master thread Master thread có ID là 0 Số lượng các thread được xác định thông qua biến môi trường hoặc qua lời gọi hàm thư viện Các thread này sẽ thực hiện đoạn mã nằm trong khai báo song song
Trang 27Hình 11: Minh họa vùng được song song hóa
• private (list): khai báo danh sách các biến là private đối với mỗi thread Điều
đó có nghĩa một quá trình xử lý sẽ sử dụng một bản sao các biến Tham chiếu tới các biến gốc được thay thế bởi tham chiếu tới các bản sao
Vùng liên tục
Vùng song song
Trang 28• firstprivate (list): giống với khai báo private, song bản sao danh sách các biến
được gán giá trị ban đầu là giá trị của các biến gốc
• lastprivate (list): giống với khai báo private, các biến gốc trong danh sách sẽ
được gán giá trị là giá trị cuối cùng sau khi ra khỏi vòng lặp hoặc ra khỏi một section
• shared (list): tất cả các thread đều có quyền truy cập tới cùng một danh sách
các biến được khai báo là shared Về thực chất, biến được chia sẻ chiếm một vị trí cụ thể trong bộ nhớ Mọi thread có thể đọc và ghi thông qua địa chỉ nhớ đó Vấn đề đặt ra là phải đảm bảo cho các thread truy cập một cách hợp lý tới các biến chia sẻ
• default (shared | none): thiết lập thuộc tính mặc định cho tất cả các biến được
sử dụng trong vùng song song hóa Riêng các biến trong khai báo
threadprivate không chịu ảnh hưởng của default Các biến có thể được khai
báo chính tắc là private, shared…mà không cần phải khai báo default
• reduction (operator : list): cho phép các biến thuộc list (biến shared) có các
bản sao là private trong mỗi thread Các thread sẽ thực hiện và ghi giá trị vào
biến private đó Kết thúc chỉ thị reduction, biến shared trong list được lấy giá
trị từ các biến private ở mỗi thread bằng cách áp dụng toán tử operator
Toán tử operator có thể là các phép +, *, -, max, min, …
• schedule (type [, chunk_size]): Chỉ thị này chỉ ra cách thức vòng lặp for được
phân chia như thế nào giữa các thread, thường được sử dụng để tạo trạng thái
cân bằng tải giữa các thread
Trong đó type có thể là: static, dynamic, guided, hoặc runtime
o static: Nếu không chỉ ra chunk_size thì chunk_size được gán bằng
CEILING(tổng số lần lặp/số luồng) Các chunk được gán lần lượt cho các thread (tức là theo kiểu round-robin)
o dynamic: Nếu không chỉ ra chunk_size thì chunk_size được gán
bằng 1 Các chunk được gán cho các thread theo kiểu: thread nào rỗi hoặc đến trước thì thực hiên trước (first-come first-do)
Trang 29o guided: Nếu không chỉ ra chunk_size thì chunk_size được gán bằng
1 Nếu chỉ ra chunk_size thì tổng số lần lặp sẽ được chỉ ra sao cho
cỡ của các chunk nối tiếp nhau (theo chỉ số tăng dần) hay chunk_size giảm theo hàm mũ chunk_size chính là cỡ của chunk
bé nhất Cách làm:
chunk_size đầu tiên = CEILING(số lần lặp chia cho số thread)
các chunk_size tiếp theo = CEILING(số lần lặp còn lại chia cho số
thread) Khi thực hiện, nếu số lượng chunk lớn hơn số thread thì thread nào thực hiện xong phần việc của mình sẽ đảm nhiệm chunk tiếp theo chưa được thực hiện
o runtime: Chunk_size sẽ được xác định khi chương trình được thực
hiện Kiểu schedule sẽ là static hoặc được chỉ ra thông qua biến môi trường OMP_SCHEDULE (như vậy có thể là DYNAMIC, GUIDED )
• threadprivate: #pragma omp threadprivate (list) <new_line>
Chỉ thị threadprivate được sử dụng để làm cho các biến có phạm vi toàn cục trở thành cục bộ và tiếp tục tồn tại trong mỗi thread trong suốt các quá trình cần được song song hóa Chỉ thị phải được xuất hiện ngay sau khi khai báo biến Sau đó mỗi thread sẽ làm việc với một bản sao các biến
• copyin (list): gán giá trị cho các biến được khai báo là threadprivate trong các
thread bằng giá trị của các biến gốc trong master thread trước khi thực hiện song song List chứa danh sách các biến để sao chép
2.6.4 Chỉ thị liên quan tới chia sẻ công việc
2.6.4.1 Do/for
Chỉ thị Do/for cho biết vòng lặp for nằm trong khai báo phải được thực thi song song
Trang 30Hình 12: Hình minh họa chỉ thị Do/for