MỤC LỤC
LỜI NÓI ĐẦU
Chương 1: TỔNG QUAN VỀ XỬ LÍ SONG SONG
1.1 Xử lý song song
1.2 Phân loại kiến trúc máy tính
1.3 Các thành phần chính của máy tính song song
1.4 Thiết kế và đánh giá thuật toán song song
1.5 Kiến trúc cụm máy tính
Chương 2: GIAO DIỆN TRUYỀN THÔNG ĐIỆP MPI
2.1 Giới thiệu về MPI
2.2 Mô hình lập trình MPI
2.3 Những hàm MPI cơ bản
2.4 Những hàm truyền thống tập thể
Chương 3: MỘT SỐ PHƯƠNG PHÁP LẶP GIẢIHỆ ĐẠI SỐ TUYẾN TÍNH
3.1 Giới thiệu
3.2 Một số phương pháp lặp tuần tự giải hệ phương trình đại số tuyến tính
3.3 Một số thuật toán lặp song song giải hệ phương trình đại số tuyến tính
3.4 Chương trình thử nghiệm
KẾT LUẬN
TÀI LIỆU THAM KHẢO
PHỤ LỤC
54 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 3038 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Đề tài Một số phương pháp song song cho hệ đại số tuyến tính, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
cả các bộ xử lí được phép ghi
vào cụng một ô nhớ nếu chúng ghi cùng một giá trị. Khi đó một bộ xử lí
sẽ được chọn để thực hiện việc ghi dữ liệu đó.
• Ghi đồng thời tự do (Arbitracy CW): một số bộ xử lí muốn ghi dữ liệu
vào một ô nhớ nhưng chỉ một bộ xử lí được phép. Trong trường hợp này
ta phải chỉ ra cách xác định bộ xử lí được chọn.
• Ghi đồng thời ngẫu nhiên (Random CW): bộ xử lí được chọn để ghi dữ
liệu là ngẫu nhiên.
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
9
• Ghi đồng thời kết hợp (Combining CW): tất cả các giá trị mà các bộ xử lí
muốn ghi đồng thời lên một ô nhớ sẽ được kết hợp lại thành một giá trị
và giá trị này sẽ được ghi vào ô nhớ đó.
Một số mụ hỡnh bộ nhớ cho mỏy truy cập ngẫu nhiờn song song PRAM:
1. Mụ hỡnh truy cập bộ nhớ đồng bộ UMA (Uniform Memory Access) của
bộ nhớ chia sẻ: tất cả các bộ xử lí làm việc nhờ cơ chế chuyển mạch tập
trung để truy cập tới bộ nhớ chia sẻ. Thời gian truy cập vào bộ nhớ là
như nhau với tất cả các bộ xử lí.
2. Mụ hỡnh truy cập bộ nhớ khụng đồng bộ NUMA của bộ nhớ chia sẻ:
trong mụ hỡnh này, bộ nhớ được phân tán và được chia thành một số
môđun nhớ độc lập. Bộ nhớ chia sẻ được phân tán cho tất cả các bộ xử lí
được gọi là các môđun nhớ địa phương và các môđun nhớ này hợp lại
thành bộ nhớ chung (toàn cục) cho cỏc bộ xử lớ.
3. Kiến trúc bộ nhớ chỉ lưu trữ COMA ( Cache-Only Memory
Architexture ): bộ nhớ chính được phân tán và chuyển thành các vùng
lưu trữ (cache), tất cả các vùng này tạo ra không gian địa chỉ toàn cục.
4. Bộ nhớ đa máy tính: trong bộ nhớ đa máy tính mỗi nút là một máy tính
có bộ nhớ địa phương không chia sẻ với những bộ xử lí khác, các bộ xử
lí liên lạc với nhau thông qua giao thức truyền thông điệp.
1.3.2 Mạng liờn kết cỏc thành phần của mỏy tớnh song song.
Trong hầu hết cỏc kiến trỳc song song, vấn đề quan trọng nhất trong thiết kế là
xác định sự liên kết giữa các bộ xử lí với nhau. Nói chung có hai loại cấu hỡnh cho
mạng liờn kết: liờn kết tĩnh và liờn kết động.
- Mạng liờn kết tĩnh là mạng cỏc thành phần của một hệ thống mỏy tớnh, bộ
xử lí và bộ nhớ được liên kết một cách cố định.
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
10
- Mạng liên kết động là mạng các thành phần của hệ thống máy tính trong đó
các liên kết giữa các bộ xử lí và bộ nhớ là có thể thay đổi được cấu hỡnh.
Sau đây là một số mô hỡnh mạng liờn kết tĩnh giữa cỏc bộ xử lớ của mỏy tớnh
song song.
1. Mạng liờn kết tuyến tớnh
Trong mạng liên kết tuyến tính các bộ xử lí được liên kết với nhau và được sắp
xếp theo thứ tự tăng dần. Trừ hai bộ xử lí đầu tiên và cuối cùng, các bộ xử lí cũn lại
cú hai lỏng giềng là bộ xử lớ trước và sau nó. Dữ liệu phải truyền qua một số bộ xử
lí nên sự truyền thông dữ liệu giữa các bộ xử lí bị chậm lại nhất là giữa bộ xử lí đầu
và cuối.
Hỡnh 1.6. Mạng liờn kết tuyến tớnh của n bộ xử lớ
2. Mạng liờn kết vũng
Mạng liờn kết vũng cú thể được tổ chức như mạng tuyến tính bằng cách nối hai
bộ xử lí đầu và cuối. Sự trao đổi giữa các bộ xử lí có thể theo một chiều hoặc hai
chiều tuy nhiên việc truyền thông giữa các bộ xử lí đặc biệt là các bộ xử lí ở xa
nhau vẫn bị trễ.
Hỡnh 1.7. Mạng liờn kết vũng của n bộ xử lớ
3. Mạng liờn kết xỏo trộn
P0 P1 Pn-1
P0 P1 Pn-1
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
11
Giả sử cú N bộ xử lớ P0, P1,…, Pn với N là lũy thừa của 2. Trong mạng liên kết
xáo trộn hoàn hảo, đường liên kết một chiều từ bộ xử lí Pi đến bộ xử lí Pj được xác
định như sau:
−+
=
N1i2
i2j
1Ni2N
12Ni0
−≤≤
−≤≤
Hỡnh 1.8. Mạng liờn kết xỏo trộn hoàn chỉnh với N=8
Hỡnh 1.8 mụ tả một mạng xỏo trộn một chiều hoàn chỉnh với N=8, trong đó
các liên kết xáo trôn được biểu diễn bằng mũi tên và các liên kết trao đổi được biểu
diễn bằng đoạn thẳng. Dễ thấy rằng ngoài bộ xử lí P0 và PN-1 tự liên kết với chính
nó, bộ xử lí i được liên kết với bộ xử lí 2i mod (N-1).
4. Mạng liên kết lưới hai chiều
Trong mạng liên kết lưới hai chiều, các bộ xử lí được sắp xếp thành một ma
trận hai chiều, mỗi bộ xử lí được liên kết với bốn láng giềng: trên, dưới, trái, phải.
Không có qui luật chung cho những bộ xử lí ở biên. Có hai biến thể của mạng lưới
hai chiều: lưới hai chiều khụng cú kết nối vũng và lưới hai chiều có kết nối vũng.
P0 P1 P2 P3 P4 P5 P6 P7
với
với
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
12
(a) Lưới không có kết nối vũng (b) Lưới có kết nối vũng
Hỡnh1.9 Mạng liờn kết lưới hai chiều
5. Mạng liờn kết siờu khối
Mạng liờn kết siờu khối d chiều gồm N= 2d bộ xử lí , mỗi bộ xử lí liên kết với d
bộ xử lí khác trong mạng. Thông thường mạng liên kết siêu khối d+1 chiều được
xây dựng bằng cách kết nối hai mạng liên kết siêu khối d chiều. Một cách hỡnh
thức, mạng liờn kết N bộ xử lí được gọi là mạng siêu khối nhị phân, các bộ xử lí
được gắn nhón nhị phõn cú giỏ trị từ 0 đến N-1, và hai bộ xử lí được gọi là láng
giềng của nhau nếu các nhón của nú chỉ khỏc nhau một bit ( tức là khỏc nhau một
lũy thừa của 2).
Hỡnh 1.10. Mạng liờn kết siờu khối 3 chiều
6. Mạng liờn kết hỡnh sao
Trong mạng liờn kết hỡnh sao, mỗi bộ xử lớ sẽ tương ứng với một hoán vị của
n kí hiệu với n là một số tự nhiên. Mạng liên kết hỡnh sao cú n! bộ xử lớ, nhón mỗi
bộ xử lớ là một hoỏn vị của n kớ hiệu. Bộ xử lớ Pi được liên kết với bộ xử lí Pj nếu
j nhận được từ i bằng cách thay kí hiệu thứ k, với 2≤ k≤ n.
K
IL
O
BO
O
K
S.
CO
M
13
Hỡnh 1.11: Mạng liờn kết hỡnh sao với 24 bộ xử lớ
1.4 Thiết kế và đánh giá thuật toán song song
1.4.1 Nguyờn lớ thiết kế thuật toỏn song song
Thuật toán song song được định nghĩa là một tập các tiến trỡnh hoặc cỏc tỏc vụ
cú thể thực hiện đồng thời và có thể trao đổi dữ liệu với nhau để kết hợp cùng giải
một bài toán. Có thể có nhiều thuật toỏn song song cựng giải một bài toỏn tựy
thuộc vào cỏch phõn chia dữ liệu cho cỏc tỏc vụ, cỏch truy xuất dữ liệu, cỏch phõn
ró cỏc tỏc vụ và cỏch đồng bộ các tiến trỡnh. Để thiết kế một thuật toán song song
tốt ta có thể sử dụng năm nguyên lí chính trong thiết kế thuật toỏn song song:
P1234
P3214
P2314
P2134
P1324
P3124
P4231
P3241
P2341
P2431
P4321
P3421
P2413
P4213
P1243
P1423
P2143
P4123
P3412
P4312
P1342
P1432
P3142
P4132
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
14
- Nguyên lí lập lịch: Giảm tối thiểu các bộ xử lí trong thuật toán mà không
làm tăng thời gian tính toán. Nói chung, khi số bộ xử lí giảm thời gian thực
hiện của chương trỡnh cú thể tăng và có thể tăng lên một hằng số nào đó
nhưng xét theo độ phức tạp của thuật toán thỡ vẫn khụng thay đổi.
- Nguyên lí đường ống: Nguyên lí này được áp dụng trong trường hợp ta
muốn thực hiện một dóy cỏc thao tỏc theo trỡnh tự {P1, P2,…, Pn} trong đó
một số bước của Pi+1 có thể thực hiên trước khi Pi kết thỳc.
- Nguyên lí chia để trị: Chia bài toán thành các phần nhỏ tương đối độc lập và
giải quyết chúng đồng thời.
- Nguyên lí đồ thị phụ thuộc dữ liệu: Chúng ta xây dựng một đồ thị có hướng
trong đó các nút biểu diễn các khối câu lệnh độc lập cũn cỏc cạnh biểu diễn
tỡnh huống khối này phụ thuộc kết quả từ việc thực hiện của khối kia. Từ đó
ta tỡm cỏch loại bỏ cỏc phụ thuộc để xây dựng thuật toán song song.
- Nguyờn lớ cạnh tranh: Nếu hai tiến trỡnh cựng truy cập vào một mục dữ
liệu chia sẻ thỡ chỳng cú thể cản trở lẫn nhau.
1.4.2 Các giai đoạn thiết kế thuật toán song song
Có ba cách tiếp cận trong thiết kế thuật toán song song cho một bài toán, đó là:
- Song song hóa các thuật toán tuần tự, biến đổi những cấu trúc tuần tự để tận
dụng khả năng song song tự nhiên của tất cả cỏc thành phần trong hệ thống
xử lớ.
- Thiết kế thuật toỏn song song hoàn toàn mới.
- Thiết kế thuật toán song song từ những thuật toán song song đó được xây
dựng.
Trong thiết kế dù sử dụng hướng tiếp cận nào thỡ cũng thường bao gồm các
giai đoạn sau:
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
15
1. Phõn ró (Partioning): Chia những tớnh toỏn và dữ liệu thành những tỏc vụ
nhỏ. Giai đoạn này chủ yếu là để tỡm kiếm khả năng thực hiện song song và
thường độc lập với kiến trúc máy tính.
2. Truyền thông (Communication): Giai đoạn này nhằm thiết lập sự phối hợp
thực hiện giữa các tác vụ và xác định thuật toán và cấu trúc truyền thông
thích hợp.
3. Tích hợp (Agglomeration): Mục đích của giai đoạn này là đánh giá những
yêu cầu hiệu năng và chi phí thực hiện. Nếu cần thiết, những tác vụ có thể
kết hợp lại thành các tác vụ lớn hơn để tăng hiệu năng và giảm chi phí thực
hiện.
4. Ánh xạ (Mapping): Mỗi tác vụ sẽ được giao cho một bộ xử lí nhằm tối đa
hóa sự tận dụng khả năng của các bộ xử lí và giảm thiểu chi phí truyền
thông. Ánh xạ có thể được xác định tĩnh (statically) hoặc trong thời gian
chạy (runtime) bằng thuật toỏn cõn bằng tải (load-balancing).
1.4.3 Đánh giá thuật toán song song
1. Thời gian thực hiện
Thời gian thực hiện của một thuật toỏn bao gồm: thời gian tớnh toỏn, thời gian
truyền thụng và thời gian rỗi.
Thời gian tớnh toỏn
Thời gian tớnh toỏn của một thuật toỏn (Tcomp) là thời gian sử dụng để
tính toán (bao gồm các phép toán logic và số học). Nếu chúng ta có một
chương trỡnh tuần tự mà thực hiện tớnh toỏn giống như thuật toán song song
chúng ta có thể xác định Tcomp bằng việc tính thời gian chương trỡnh đó. Nếu
không chúng ta có thể phải thực thi những nhân then chốt. Thời gian tính
toán sẽ thường phụ thuộc vào kích thước bài toán dù nó được biểu diễn bởi
một tham số N hay bởi một tập các tham số N1, N2, …, Nm.Thời gian tớnh
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
16
toỏn cũn phụ thuộc vào số cỏc tỏc vụ hoặc số bộ xử lớ. Trong mạng mỏy
tớnh song song khụng đồng nhất ( như mạng các máy trạm), thời gian tính
toán có thể biến thiên theo bộ xử lí mà tại đó tính toán được thực hiện. Thời
gian tính toán cũng phụ thuộc vào đặc điểm của những bộ xử lí và phương
thức nhớ của chúng.
Thời gian truyền thụng
Thời gian truyền thụng của một thuật toỏn ( Tcomm) là thời gian mà tất cả
các tác vụ của nó sử dụng để gửi và nhận thông điệp.Có hai loại truyền
thông: truyền thông giữa các bộ xử lí (interprocessor) và truyền thông trong
bộ xử lí (intraprocessor). Trong truyền thông giữa các bộ xử lí, hai tác vụ
thực hiện truyền thông với nhau thông được định vị trên những bộ xử lí khác
nhau. Điều này luôn xảy ra khi thuật toán tạo một tỏc vụ trờn một bộ xử lớ.
Truyền thụng trong bộ xử lớ, thỡ hai tỏc vụ thực hiện truyền thụng định vị
trên một bộ xử lí. Để đơn giản ta giả sử chi phí truyền thông giữa bộ xử lí và
truyền thông trong bộ xử lí là ngang nhau. Điều giả sử này không phải là
không có cơ sở trong nhiều đa máy tính, trừ khi liên lạc trong bộ xử lí được
tối ưu hóa cao độ. Đó là bởi vỡ chi phớ của những bản sao và chuyển ngữ
cảnh từ bộ nhớ sang bộ nhớ thực hiện trong truyền thụng trong bộ xử lớ
thường có thể so sánh được với chi phí của truyền thông giữa các bộ xử lí.
Trong những môi trường như các máy trạm kết nối Ethernet, truyền thông
trong bộ xử lí nhanh hơn rất nhiều. Trong kiến trúc đa máy tính lí tưởng, chi
phí gửi thông điệp giữa hai tác vụ định vị trên những bộ xử lí khác nhau có
thể biểu diễn bằng hai tham số: thời gian khởi động thông điệp ts, là thời gian
cần để khởi tạo sự truyền thông, và thời gian truyền một từ ( thường là bốn
byte) tw , được xác định bằng băng thông vật lí của kênh truyền thông liên
kết bộ xử lí nguồn và đích. Ví dụ, thời gian gửi thông điệp L từ là:
Tmsg= ts + TwL
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
17
Thời gian rỗi
Thời gian tính toán và thời gian truyền thông đều được chỉ ra một cách
rừ ràng trong thuật toỏn song song vỡ thế khụng khú khăn để tính tổng của
chúng trong thời gian thực hiện. Thời gian rỗi (Tidle) có thể khó xác định hơn,
tuy nhiên chúng thường phụ thuộc vào thứ tự các thao tác được thực hiện.
Một bộ xử lớ cú thể rỗi vỡ khụng cú tớnh toỏn hoặc thiếu dữ liệu. Trong
trường hợp đầu tiên, thời gian rỗi có thể tránh bằng việc sử dụng những kĩ
thuật tải cân bằng. Trong trường hợp thứ hai bộ xử lí rỗi trong khi tính toán
và truyền thông đợi dữ liệu ở xa được thực hiện. Thời gian rỗi này đôi khi có
thể tránh bằng việc xây dựng một chương trỡnh mà những bộ xử lớ thực hiện
những tính toán hoăc truyền thông khác trong khi đợi dữ liệu ở xa.
2. Hiệu suất và hệ số gia tốc
Thời gian thực hiện không phải lúc nào cũng là thước đo tốt nhất để đánh giá
hiệu năng thuật toán. Vỡ thời gian thực hiện cú khuynh hướng biến thiên theo kích
thước bài toán, thời gian thực hiện phải được chuẩn hóa khi so sánh hiệu năng thuật
toán với những kích thước khác nhau của bài toán. Hiệu suất - phần thời gian mà
bộ xử lí sử dụng để làm công việc có ích- cung cấp một thước đo tốt cho chất lượng
của một thuật toán song song. Nó đặc trưng hóa sự hiệu quả của một thuật toán sử
dụng tài nguyên tính toán của một máy tính song song một cách độc lập với kích
thước bài toán. Chúng ta định nghĩa hiệu suất tương đối như sau:
E=
P
1
PT
T
trong đó T1 là thời gian thực hiện trờn một bộ xử lớ và TP là thời gian trên P bộ xử
lí. Một đại lượng liên quan nữa là hệ số gia tốc tương đối:
S=PE
là hệ số chỉ ra thời gian thực hiện giảm đi khi sử dụng P bộ xử lí.
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
18
Những đại lượng trên được gọi là hệ số tăng tốc và hiệu suất tương đối vỡ
chỳng được định nghĩa với khía cạnh thuật toán song song thực hiện trên một bộ xử
lí đơn. Giả sử rằng chúng ta có một thuật toán song song mà mất 10000 giây trên
một bộ xử lí và 20 giây trên 1000 bộ xử lí. Một thuật toán khác cũng mất 1000 giây
trên một bộ xử lí nhưng chỉ mất 5 giây trên 1000 bộ xử lí. Rừ ràng thuật toỏn thứ
hai là tốt hơn với P trong khoảng 1 đến 1000. Nó có hệ số gia tốc chỉ 200 so với
500 của thuật toán đầu.
Khi so sánh hai thuật toán, sẽ hữu ích hơn nếu có một tiêu chuẩn độc lập thuật
toán hơn là thời gian thực hiện. Vỡ thế chỳng ta định nghĩa hệ số tăng tốc và hiệu
suất tuyệt đối sử dụng như là phép đo thời gian bộ xử lí duy nhất (T1) cho thuật
toán tốt nhất. Trong nhiều trường hợp, thuật toán tốt nhất này sẽ là thuật toỏn (tuần
tự) tốt nhất.
1.5 Kiến trỳc cụm mỏy tớnh
Trước đây, thuật ngữ “máy tính hiệu năng cao” (High- Performance Computing
- HPC) thường được dùng để chỉ những máy tính song song hoặc máy tính véc tơ
với giá trị lên tới hàng triệu đôla. Nhưng với sự phát triển nhanh chóng của công
nghệ phần cứng đặc biệt là những tiến bộ trong việc cải tiến hiệu năng của bộ xử lí
và băng thông mạng đó làm thay đổi một cách toàn diện kiến trúc của các máy tính
hiệu năng cao. Và khi các máy tính hiệu năng cao được tạo ra bằng cỏch kết nối
cỏc mỏy trạm (Workstation – WS) với nhau thỡ thuật ngữ “cụm mỏy tớnh”
(Computer Cluster) được sử dụng để mô tả dạng máy tính này.
Cụm máy trạm (Workstation Cluster -WSC) là một nhóm các máy trạm được
kết nối với nhau thông qua một mạng tốc độ cao. Các máy tính trong một WSC
truyền thông qua một trong hai giao thức truyền thông phổ biến đó là: truyền thông
dựa trên kết nối và truyền thông không kết nối. Mô hỡnh kết nối dựa trờn giao thức
TCP (Tranmission Control Protocol) với độ tin cậy cho việc truyền thông điệp
được bảo đảm. Mô hỡnh khụng kết nối dựa trờn giao thức UDP (User Datagram
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
19
Protocol), với giao thức này độ tin cậy cho việc truyền thông điệp được bảo đảm.
Hiện nay có rất nhiều phần mềm hỗ trợ việc tính toán song song trên WSC tiêu
biểu như MPICH.
WSC có rất nhiều ưu điểm đó là:
o Kĩ thuật tính toán trên các cụm máy tính có thể mở rộng từ một hệ thống
nhỏ đến các hệ thống rất lớn. Điều này thể hiện tính mềm dẻo và linh
hoạt của hệ thống. Hệ thống có thể chỉ gồm một máy tính hoặc nhiều
máy tính ghép nối mạng với nhau. Những máy tính nối mạng Internet
cũng có thể ghép cụm được. Hệ thống cũng có thể bao gồm những máy
tính chuyên dụng khác nhau.
o Thiết bị phần cứng dùng để xây dựng một cụm máy tính như các máy
tính cá nhân và các máy trạm hiện nay được bán rộng rói trờn thị trường
với giá thành thấp. Về nguyên tắc một cụm máy tính chỉ cần có một màn
hỡnh và một bàn phớm nờn giảm được chi phí ban đầu.
o Các bộ xử lí mới có thể dễ dàng tích hợp vào hệ thống như là chúng đó
cú sẵn trong hệ thống. Đây là ưu điểm của cụm máy tính so với những hệ
thống song song khác và nó nói lên tính an toàn cao của hệ thống.
Kiến trúc bó IBM 1600 của trung tâm tính toán hiệu năng cao:
• 5 node tớnh toỏn pSeires 655, mỗi node gồm 8 CPU Power4+16 bit
RISC 1.7 GHz của IBM; cache 5.6 MB ECC L2, 128 MB ECC L3, băng
thông: 72.3 GBps; 32 GB RAM, băng thông bộ nhớ 51.2 GBps; 6x36
GB HDD. Năng lực tính toán tổng cộng khoảng 240 GFlóp (mở rộng tối
đa 768 GFlops/16 node).
• 1 node quản lớ phần mềm CSM p630: Power4+64 bit 1.2 GHz; cache 1.5
MB ECC L2, 8 MB ECC L3, băng thông: 12.8 GBps; 1 GB RAM, băng
thông: 6.4 GBps; 6x36 GB HDD, DVD ROM.
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
20
• 1 node điều khiển phần cứng HCM: Intel Xeon 3.06 GHz, 1GB RAM, 40
GB HDD, DVD RAM.
• Các node được kết nối với nhau thông qua HPS (High Performance
Switch – Switch hiệu năng cao), băng thông 2 GBps và Gethernet.
• Hệ thống lưu trữ chung: IBM DS4400 và EXP700 kết nối với cụm IBM
1600 thông qua cáp quang với băng thông 2 GBps.
• Các node chạy HĐH AIX 5L phiên bản 5.2
Kiến trỳc bú IBM 1350 của trung tâm tính toán hiệu năng cao:
• 8 node tính toán, mỗi node gồm 2 chip Intel Xeon Dual Core 3.2 GHz, 2
GB RAM, 1x36 GB HDD, DVD ROM. Tổng năng lực tính toán của 8
node là khoảng 51.2 Gflops.
• 2 node phục vụ lưu trữ, mỗi node gồm 2 chip Intel Xeon Dual Core 3.2
GHz, 3 GB RAM, 4x72 GB HDD.
• 1 node đóng vai trũ quản lớ bao gồm chip Intel Xeon Dual Core 3.2
GHz, 3 GB RAM, 2x36 GBHDD.
• Năng lực lưu trữ: thiết bị lưu trữ dùng chung EXP400 với 10x73 GB
HDD SCSI 320 MBps 15KRpm, dùng hệ thống chia sẻ file: GPFS cho
Linux v2.3.0.5
• Các node chạy HĐH Redhat Enterprise Linux 3.0 và được kết nối với
nhau thông qua mạng Gethernet.
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
21
Chương 2: GIAO DIỆN TRUYỀN THÔNG ĐIỆP MPI
2.1 Giới thiệu về MPI
Giao diện truyền thông điệp chuẩn MPI (Message Passing Interface) là một thư
viện truyền thông chuẩn. Mục đích của MPI là thiết lập một chuẩn truyền thông
điệp linh hoạt và hiệu quả được sử dụng rộng rói cho việc viết cỏc chương trỡnh
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
22
truyền thụng điệp. MPI không phải là chuẩn ISO hay IEEE nhưng trên thực tế nó
đó trở thành chuẩn công nghiệp cho việc viết các chương trỡnh truyền thụng điệp
trên nền HPC (Hight Performance Computing).
2.2 Mụ hỡnh lập trỡnh MPI
Trong mụ hỡnh lập trỡnh MPI, cỏc tiến trỡnh truyền thụng bằng cỏch gọi cỏc
hàm thư viện để gửi và nhận thông điệp với những tiến trỡnh khỏc. Trong hầu hết
cỏc chương trỡnh MPI, số bộ xử lý cố định khi khởi tạo chương trỡnh, và một tiến
trỡnh được tạo ra trên một bộ xử lý. Tuy nhiờn, những tiến trỡnh này cú thể chạy
những chương trỡnh khỏc nhau. Vỡ thế mụ hỡnh lập trỡnh MPI đôi khi được đề
cập như là đa chương trỡnh đa luồng dữ liệu (MPMD) để phân biệt với mô hỡnh
SPMD (mỗi bộ xử lý thực thi cựng một chương trỡnh).
Số tiến trỡnh trong một chương trỡnh MPI thường cố định. Những tiến trỡnh
cú thể sử dụng thao tỏc truyền thông điểm tới điểm từ một tiến trỡnh cụ thể tới
được một tiến trỡnh khỏc, những thao tỏc này cú thể sử dụng để thực thi những
truyền thông cục bộ và không có cấu trúc. Một nhóm các tiến trỡnh cú thể gọi cỏc
thao tỏc truyền thụng tập thể để thực hiện những thao tác toàn cục như tổng hợp và
quảng bá. MPI hỗ trợ truyền thông không đồng bộ (dị bộ). Có lẽ tính năng quan
trọng nhất của MPI từ quan điểm của công nghệ phần mềm là nó hỗ trợ lập trỡnh
module. Một cơ chế được gọi là bộ truyền thông (communicator) cho phộp lập
trỡnh viờn MPI định nghĩa module trong đó đóng gói các cấu trúc truyền thông bên
trong.
Những thuật toỏn mà tạo ra chỉ một tỏc vụ trờn một bộ xử lý cú thể thực hiện
trực tiếp sử dụng những hàm truyền thụng tập thể hay điểm tới điểm. Những thuật
toán mà tạo ra nhiều tác vụ theo một cách động hoặc phụ thuộc vào sự thực hiện
đồng thời của một vài tác vụ trên 1 bộ xử lý phải được biến đổi để có thể thực thi
MPI.
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
23
2.3 Những hàm MPI cơ bản
Mặc dự MPI là một hệ thống phức tạp chỳng ta cú thể giải những bài toán
thuộc một phạm vi rộng mà chỉ sử dụng 6 hàm cơ bản. Những hàm này khởi tạo và
kết thúc một chương trỡnh MPI, xỏc định nhận dạng các tiến trỡnh, gửi và nhận
thụng điệp.
MPI_Init khởi tạo môi trường MPI
MPI_Finalize đóng môi trường MPI
MPI_Comm_size xác định số các tiến trỡnh
MPI_Comm_rank xác định số hạng tiến trỡnh
MPI-Send gửi một thông điệp
MPI-Recv nhận một thông điệp
Những hàm này được mô tả chi tiết sau đây,trong đó nhón IN, OUT, và INOUT
đứng trước tham số chỉ ra rằng:
IN: hàm sử dụng nhưng không làm thay đổi tham số.
OUT: hàm không sử dụng nhưng có thể thay đổi tham số.
INOUT: hàm sử dụng và cập nhật tham số.
• MPI_Init (int*arge, char ***argv);
Đây là hàm khởi tạo môi trường thực thi MPI. Tham số argc, argv được sử
dụng trong C như là những tham số của chương trỡnh chớnh (hàm main).
Hàm này phải được gọi trong mọi chương trỡnh MPI và trước bất kỳ hàm
MPI nào khác, và chỉ được gọi một lần trong một chương trỡnh MPI chương.
Với những chương trỡnh C, MPI_Init cú thể được sử dụng để truyền những
tham số dũng lệnh tới tất cả cỏc bộ xử lý.
• MPI_Finalize( );
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
24
Dùng để đóng môi trường thực thi MPI. Hàm này được gọi cuối cùng trong
mọi chương trỡnh MPI, khụng một hàm MPI nào cú thể gọi sau nú.
• MPI_Comm_size (comm, & size);
Hàm lấy số tiến trỡnh
IN comm bộ truyền thụng
OUT size số cỏc tiến trỡnh trong nhúm comm
• MPI_Comm_rank (comm, & rank);
Hàm lấy hạng của tiến trỡnh.
IN comm bộ truyền thụng
OUT rank số của tiến trỡnh trong nhúm comm.
Một bộ truyền thụng gồm một tập cỏc tiến trỡnh trong đó các tiến trỡnh cú
thể thực hiện truyền thụng với nhau. Bộ truyền thụng cung cấp một cơ chế
nhận dạng tập các tiến trỡnh cho việc phỏt triển những chương trỡnh module
và để đảm bảo các thông điệp dành cho những mục đích khác nhau không bị
nhầm lẫn. Nó cung cấp giá trị mặc định MPI_COMM_WORLD, xác định tất
cả các tiến trỡnh trong chương trỡnh. Mỗi tiến trỡnh được gán một số hạng là
số nguyên liên tiếp bắt đầu từ 0. Số hạng này cũn được gọi là id của tiến
trỡnh.
Bốn hàm trờn thuộc nhúm những hàm quản lý mụi trường. Một ví dụ nhỏ sử
dụng các hàm này viết bằng ngôn ngữ C.
#include
#include
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
25
int main(int argc, char **argv)
{
int rank, size;
MPI_Init( &argc, &argv );
MPI_Comm_rank(MPI_COMM_WORLD, &rank );
MPI_Comm_size(MPI_COMM_WORLD, &size );
printf("Hello! I am %d of %d \n", rank, size);
MPI_Finalize();
return 0;
}
Nếu chương trỡnh trờn được chạy bởi 4 tiến trỡnh thỡ ta sẽ thu được kết quả có
dạng như sau:
Hello! I am 1 of 4
Hello! I am 3 of 4
Hello! I am 0 of 4
Hello! I am 2 of 4
• MPI_Send (void *buff, int count, MPI_Datatype datatype, int dest, int tag,
MPI_Comm comm);
Đây là hàm gửi thông điệp.
IN buff địa chỉ đầu tiên của bộ nhớ đệm chứa dữ liệu để
gửi.
IN count số phần tử dữ liệu trong bộ đệm.
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
26
IN datatype kiểu của dữ liệu trong bộ đệm.
IN dest số hạng của tiến trỡnh nhận.
IN tag nhón của thụng điệp gửi.
IN comm bộ truyền thụng.
• MPI_Recv (void *buff, int count, MPI_Datatype datatype, int sourse, int
tag, MPI_Comm comm, MPI_Status status)
OUT buff địa chỉ đầu tiên của bộ nhớ đệm nhận dữ liệu.
IN count kích thước của bộ nhớ đệm nhận tính bằng số phần tử dữ
liệu.
IN datatype kiểu dữ liệu của các phần tử trong bộ nhớ đệm
nhận.
IN source số hạng của tiến trỡnh nguồn (gửi).
IN tag nhón của thụng điệp.
OUT status trạng thỏi.
Hai hàm này thuộc nhóm hàm truyền thông điểm tới điểm. Các hàm này chỉ
truyền thông điệp giữa hai và chỉ hai tiến trỡnh MPI. Một tiến trỡnh thực hiện thao
tỏc gửi và tiến trỡnh cũn lại thực hiện thao tỏc nhận tương ứng.
Với ngụn ngữ C, chỳng ta cú thể lập trỡnh MPI bằng cỏch sử dụng thư viện
mpi.h. Những tên hàm giống với MPI chuẩn nhưng chỉ MPI được viết hoa và chữ
cái đầu tiên của tên hàm được viết hoa. Mó trả về cho việc khởi tạo thành cụng là
MPI-SUCCESS. Một tập mó lỗi cũng được định nghĩa. Những hằng số đều được
viết hoa và được định nghĩa trong thư viện mpi.h. Những kiểu dữ liệu MPI được
định nghĩa cho mỗi kiểu dữ liệu C: MPI_CHAR, MPI_LONG,
MPI_UNSIGNED_CHAR, MII_UNSIGNED, MPI_UNSIGNED_LONG,
MPI_FLOAT, MPI_DOUBLE, MPI_LONG_DOUBLE…
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
27
Những tham số của hàm số cú nhón IN được truyền theo giá trị, trong khi
những tham số nhón OUT, INOUT truyền theo tham chiếu (như con trỏ). Biến
status thuộc kiểu MPI_Status có trường status.MPI_SOURCE và status.MPI_TAG
gồm các thông tin về souce và tag như trong ví dụ sau (số tiến trỡnh cố định bằng
2).
#include
#include
int main(int argc,char **argv)
{
int size, rank, dest, source, count, tag=1;
char send=’x’, recv;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank = =0)
{
dest = 1;
source = 1;
MPI_Send(&send, 1, MPI_CHAR, dest, tag, MPI_COMM_WORLD);
MPI_Recv(&recv, 1, MPI_CHAR, source, tag, MPI_COMM_WORLD,
&status);
}
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
28
else if (rank == 1)
{
dest = 0;
source = 0;
MPI_Recv(&send, 1, MPI_CHAR, source, tag, MPI_COMM_WORLD,
&status);
MPI_Send(&recv, 1, MPI_CHAR, dest, tag, MPI_COMM_WORLD);
}
MPI_Get_count(&status, MPI_CHAR, &count);
printf("Process %d received %d char(s) from process %d with tag %d \n",
rank, count,status.MPI_SOURCE,status.MPI_TAG);
MPI_Finalize();
}
2.3 Những hàm truyền thụng tập thể
Chúng ta có thể xây dựng nhiều chương trỡnh MPI chỉ với 6 hàm cơ bản được
trỡnh bày trong phần 2.2. Tuy nhiờn, để thuận tiện cho việc truyền thông với tất cả
các bộ xử lý trong một lời gọi, MPI cung cấp những hàm truyền thông tập thể. Tất
cả các hàm này đều được thực hiện một cách tập thể, có nghĩa là mỗi tiến trỡnh
trong một nhúm tiến trỡnh gọi hàm truyền thụng này với cựng cỏc tham số.
• MPI_Barrier(MPI_Comm comm);
Hàm đồng bộ hoá.
IN comm bộ truyền thụng.
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
29
• MPI_Bcast(void *buff, int count, MPI_Datatype datatype, int root,
MPI_Comm comm )
INOUT buff địa chỉ của bộ đệm.
IN count số phần tử trong bộ đệm.
IN datatype kiểu dữ liệu của phần tử gửi.
IN root hạng của tiến trỡnh thực hiện quảng bỏ.
IN comm bộ truyền thụng.
• MPI_Gather(void* sendbuf, int sendcount, MPI_Datatype sendtype, void*
recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
Hàm tổng hợp dữ liệu.
• MPI_Scatter(void* sendbuf, int sendcount, MPI_Datatype sendtype, void*
recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
Hàm phõn phối dữ liệu.
IN sendbuf địa chỉ đầu tiên của bộ nhớ đệm chứa các phần tử.
IN sendcount số phần tử gửi.
IN sendtype kiểu dữ liệu của phần tử gửi.
OUT recvbuf địa chỉ đầu tiên của bộ nhớ đệm nhận.
IN recvcount số phần tử nhận.
IN recvtype kiểu dữ liệu của phần tử nhận.
IN root số hạng của tiến trỡnh thực hiện.
IN comm bộ truyền thụng.
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
30
• MPI_Reduce(void* sendbuf, void* recvbuf, int count, MPI_Datatype
datatype, MPI_Op op, int root, MPI_Comm comm)
• MPI_Allreduce(void* sendbuf, void* recvbuf, int count, MPI_Datatype
datatype, MPI_Op op, MPI_Comm comm)
Hàm tớnh toỏn tập thể.
IN sendbuf địa chỉ của bộ đệm gửi.
OUT recvbuf địa chỉ của bộ đệm nhận.
IN count số phần tử trong bộ đệm gửi.
IN datatype kiểu dữ liệu của phần tử gửi.
IN op phộp toỏn.
IN root số hạng của tiến trỡnh nhận.
IN comm bộ truyền thụng.
Những hàm truyền thụng tập thể cú ba loại:
• Đồng bộ hoá.
• Di chuyển dữ liệu.
• Tớnh toỏn tập thể.
2.3.1 Hàm đồng bộ hoá
MPI_Barrier được sử dụng để đồng bộ hoá sự thực thi của một nhóm các tiến
trỡnh. Mỗi tiến trỡnh khi gặp lời gọi hàm này đều dừng lại cho đến khi tất cả các
hàm trong bộ truyền thông đều gọi nó. Hàm này cho phép phân tách hai pha của
một chương trỡnh để đảm bảo những thông điệp trong hai pha không bị lẫn lộn với
nhau.
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
31
2.3.2. Cỏc hàm di chuyển dữ liệu
MPI_Bcast, MPI_Gather và MPI_Scatter là ba hàm di chuyển dữ liệu tập thể.
Tiến trỡnh gốc (thực thi cỏc hàm này) quảng bỏ, tổng hợp hay phõn phối dữ liệu
cho tất cả cỏc tiến trỡnh trong bộ truyền thụng. Hoạt động của các hàm này được
minh hoạ trong hỡnh 2.1.
A0
A0
A0
A0
A0
A0
A1
A2
A3
A0 A1 A2 A3
A0 A1 A2 A3
A0
A1
A2
A3
data
MPI_Bcast
MPI_Gather
MPI_Scatter
processes
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
32
Hỡnh 2.1: Cỏc hàm di chuyển dữ liệu minh hoạ cho nhúm 4 tiến trỡnh.
MPI_Bcast thực hiện việc quảng bỏ dữ liệu từ một tiến trỡnh tới tất cả cỏc tiến
trỡnh khỏc. Tiến trỡnh root gửi dữ liệu giống nhau cho tất cả cỏc tiến trỡnh khỏc và
cỏc tiến trỡnh này nhận cựng dữ liệu đó từ tiến trỡnh root. Dữ liệu định vị ở buff
của tiến trỡnh root, gồm count phần tử kiểu datatype được sao lại trong buff của tất
cả cỏc tiến trỡnh.
MPI_Grather thực hiện việc tổng hợp dữ liệu từ tất cả cỏc tiến trỡnh về một
tiến trỡnh. Tất cả cỏc tiến trỡnh bao gồm cả tiến trỡnh root gửi dữ liệu định vị tại
sendbuf tới tiến trỡnh root. Tiến trỡnh này thu thập dữ liệu lưu vào recvbuf theo thứ
tự trong đó dữ liệu gửi tiến trỡnh i đứng trước dữ liệu gửi tiến trỡnh i+1. Vỡ thế
recvbuf của tiến trỡnh root lớn hơn P lần sendbuf với P là số tiến trỡnh trong bộ
truyền thụng.
MPI_Scatter ngược lại với MPI_Gather thực hiện việc phân phối dữ liệu từ một
tiến trỡnh tới tất cả cỏc tiến trỡnh. Tiến trỡnh root gửi phần tử i của dữ liệu trong
sendbuf tới tiến trỡnh i. Mỗi tiến trỡnh nhận dữ liệu từ root lưu vào recvbuf. Vỡ
thế, sendbuf của tiến trỡnh root lớn hơn P lần recvbuf. Ta thấy cú sự khỏc biệt giữa
hàm MPI_Scatter với hàm MPI_Bcast. Với MPI_Bcast mọi tiến trỡnh nhận cựng 1
trị số từ tiến trỡnh root, cũn với MPI_Scartter mọi tiến trỡnh nhận một trị số khỏc
nhau.
Ví dụ chương trỡnh sử dụng hàm MPI_Scatter phõn phối dữ liờu cho cỏc bộ xử
lớ:
#include
#include
#define N 4
int main(int argc,char **argv){
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
33
int size, rank, sendcount, recvcount, source;
float sendbuf[N][N] = {
{1.0, 2.0, 3.0, 4.0},
{5.0, 6.0, 7.0, 8.0},
{9.0, 10.0, 11.0, 12.0},
{13.0, 14.0, 15.0, 16.0} };
float recvbuf[N];
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_N(MPI_COMM_WORLD, &size);
if (size = = N) {
source = 1;
sendcount = N;
recvcount = N;
MPI_Scatter(sendbuf,sendcount,MPI_FLOAT,recvbuf,recvcount,
MPI_FLOAT,source,MPI_COMM_WORLD);
printf("rank= %d Results: %f %f %f %f\n",rank,recvbuf[0],
recvbuf[1],recvbuf[2],recvbuf[3]);
}
else
printf("Must specify %d processors. Terminating.\n",N);
MPI_Finalize();
}
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
34
Nếu chạy chương trỡnh với 4 bộ xử lớ kết quả sẽ là:
rank= 0 Results: 1.000000 2.000000 3.000000 4.000000
rank= 1 Results: 5.000000 6.000000 7.000000 8.000000
rank= 2 Results: 9.000000 10.000000 11.000000 12.000000
rank= 3 Results: 13.000000 14.000000 15.000000 16.000000
2.3.3. Cỏc hàm tớnh toỏn dữ liệu
Hàm MPI_Reduce và MPI_Allreduce đều là hàm tính toán dữ liệu. Chúng kết
hợp trị số trong sendbuf của mỗi tiến trỡnh, sử dụng phộp toỏn op rồi trả về kết quả
trong recvbuf của tiến trỡnh root khi sử dụng hàm MPI_Reduce, và của tất cả cỏc
tiến trỡnh khi sử dụng MPI_Allreduce. Tất cả cỏc phộp toỏn trả về count kết quả cú
cựng kiểu dữ liệu với cỏc toỏn hạng.
Cỏc phộp toỏn bao gồm:
MPI_MAX tớnh giỏ trị lớn nhất
MPI_MIN tớnh giỏ trị nhỏ nhất
MPI_SUM tớnh tổng
MPI_PROD nhõn
MPI_LAND và
MPI_BAND phộp và từng bit
MPI_LOR hoặc
MPI_BOR phộp hoặc từng bit
MPI_LXOR xor
MPI_BXOR xor từng bit
MPI_MAXLOC tỡm giá trị lớn nhất và địa chỉ
MPI_MINLOC tỡm giỏ trị nhỏ nhất và địa chỉ
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
35
Hỡnh 2.2. Minh hoạ cho hàm MPI_Reduce và MPI_Allreduce.
Processes
Initial
data: 2 4
0 1 2 3
5 7 0 3 6 2
MPI_Reduce với MPI_MIN, root= 0:
0 2 - - - - - -
MPI_Allreduce với MPI_MIN
0 2 0 2 0 2 0 2
MPI_Reduce với MPI_SUM, root =2
- - - - - - 13 16
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
36
Chương 3: MỘT SỐ PHƯƠNG PHÁP LẶP GIẢI
HỆ ĐẠI SỐ TUYẾN TÍNH
3.1 Giới thiệu
Cho hệ phương trỡnh đại số tuyến tớnh :
bAX=
(3.1.1)
với nnnn RXRbRA ∈∈∈ × ,,
=++
=++
⇔
nnnnn
nn
bxaxa
bxaxa
...
...............................
...
11
11111
Biến đổi phương trỡnh (3.2.1) về dạng:
X= BX + g
trong đó nnn RgRB ∈∈ × , . Khi đó phép lặp
gBXX kk +=+ )()1(
với X(0) nR∈ cho trước hội tụ nếu 1<B (với . là chuẩn ma trận tương thích với
chuẩn véc tơ). Điều kiện cần và đủ để cho dóy lặp hội tụ với X(0) lấy bất kỡ là
1)( <Bρ với ρ là bỏn kớnh phổ của ma trận.
3.2 Một số phương pháp lặp tuần tự giải hệ phương trỡnh đại số tuyến tính
3.2.1 Phương pháp lặp Jacobi
Ta cú:
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
37
ULDA ++=
trong đó: D là ma trận đường chéo, L và U lần lượt là ma trận tam giác dưới và ma
trận tam giác trên.
Cụng thức lặp Jacobi:
32143421
g
k
B
k bDXULDX 1)(1)1( )( −−+ ++−=
(3.2.1)
Phương trỡnh thứ i của cụng thức lặp:
,...1,0,)()1( =+⋅−=∑
≠
+ k
a
b
x
a
a
x
ii
ik
j
ij ii
ijk
i
Ta chứng minh sự hội tụ của phộp lặp Jacobi với A là ma trận chộo trội:
• Nếu A chộo trội theo hàng:
{ 1
1
<
=⇒
∑
≠
≤≤
∞
ii
ij
ij
ni a
a
MaxB
• Nếu A chộo trội theo cột:
Đặt biến phụ: iiii xaz =
=
=⇒
nn x
x
D
z
z
z
.
.
.
.
.
.
11
Kớ hiệu: ixaz kiiii ∀= ,)(
Nhõn 2 vế (2) với aii được:
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
38
...,1,0,
)(
)1(
)()1(
=+−=
+−=
∑
∑
≠
+
≠
+
kb
a
z
az
bxaxa
i
jj
k
j
ij
ij
k
i
i
ij
k
jij
k
iii
Cụng thức lặp cho Z dạng:
1ˆ
ˆ
1
11
)()1(
<
=
+⋅=
<
≠
≤≤
+
∑
321
jj
ij
ij
ni
kk
a
a
MaxB
bZBZ
3.2.2 Phương pháp lặp JOR (Jacobi Overrelaxation)
Phương pháp Jacobi Overrelaxation (JOR) có công thức:
...,1,0,)( )(1)()1( =−+= −+ kAXbDXX kkk ω (3.2.2)
với tham sốω .
3.2.3 Phương pháp SOR (Successive overrelaxation)
Phương pháp Successive Overrelaxation (SOR) có công thức lặp:
( 1) 1 ( 1) ( ) ( )( ) (1 )k k k kX D b LX UX Xω ω+ − += − − + − (3.2.3)
với ω là tham số gión. Khi 1ω = , SOR trở thành phương pháp Gass-Seidel.
Viết lại (3.2.4) dưới dạng:
bDUXDLXDXX kkkk 1)(1)1(1)()1( )1( −−+−+ +−−−= ωωωω
Ta cú:
bDUXDXXLDI kkk 1)(1)()1(1 )1()( −−+− +−−=+ ωωωω
bUXDXXLD kkk ωωωω +−−=+ + )()()1( )1()(
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
39
Với giả thiết 0)det( ≠+ LD ω ta thu được:
44 344 2144444 344444 21
g
k
B
k bLDXUDXLDX 1)(1)1( )())1(()( −−+ ++−−+= ωωωωω
Điều kiện cần để phép lặp SOR hội tụ là 1det <B với
))1(()( 1 UDXLDB ωωω −−+= − .
Ta cú 11 det)det( −− =+ DLD ω và DUD n det)1())1det(( ωωω −=−−
Suy ra:
n
n
B
DDB
)1(det
det)1.(detdet 1
ω
ω
−=
−=
−
20
11
1)1(1det
<<⇔
<−⇔
<−⇔<
ω
ω
ω nB
Vậy điều kiện cần để cho phép lặp SOR hội tụ là )2,0(∈ω .
3.3 Một số thuật toán lặp song song giải hệ phương trỡnh đại số tuyến tính
Cấu trỳc của cỏc bộ xử lớ trong thuật toỏn
Một trong những bộ xử lí được chỉ định làm Master; bộ xử lí này điều khiển sự
thi hành của thuật toán. Những bộ xử lí khác được gọi là Server và chúng thi hành
khi có yêu cầu của bộ xử lí Master. Những Server chịu trách nhiệm cho những tính
toán trên dữ liệu phân tán. Bộ xử lí Master cũng đóng vai trũ giống một Server, vỡ
một phần dữ liệu cũng được gán cho nó. Điều này đảm bảo rằng tất cả các bộ xử lí
đều làm việc hết khả năng.
3.3.1 Thuật toỏn song song Jacobi
Phộp lặp Jacobi cú thể song song hoỏ sử dụng cỏch phõn chia hàng phõn tỏn dữ
liệu cho cỏc bộ xử lớ:
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
40
)( )(
,*:
)(
,*::
1
,*:
)1(
:
k
qr
k
qrqrqr
k
qr XUXLbDX pppppppppp −−=
−+
(3.3.1)
Chỉ số dưới pp qr : chỉ ra rằng bộ xử lớ p sẽ cập nhật những phần tử
qrrix i ,...,1,, += . Dấu * biểu thị tất cả cỏc cột.
Thuật toán song song Jacobi có thể phân thành các bước sau:
Bước 1: Khởi tạo: Mỗi bộ xử lí nhận hàng pp qr : của ma trận U và L, nhận cỏc
phần tử pp qr : của véc tơ cột b;
Bước 2: Lặp: Mỗi bộ xử lí Server nhận )(kX , cập nhật nú và trả lại )1(
:
+k
qr Pp
X cho
bộ xử lí Master, nơi kiểm tra sự hội tụ.
3.3.2 Thuật toỏn song song JOR
Phương pháp JOR không có sự phụ thuộc dữ liệu giữa những phần tử của các
véc tơ trong mỗi phép lặp; vỡ thế phộp lặp JOR cú khả năng song song hóa dễ
dàng. Sử dụng cách phân chia hàng, phép lặp JOR có thể phân tán giữa P bộ xử lí
theo cách sau:
PpxAbDXX kqrqrqr
k
qr
k
qr pppppppppp
,...,2,1,)( )(
,*::
1
,*:
)(
:
)1(
: =−+=
−+ ω
(3.3.2)
Chỉ số dưới pp qr : chỉ ra rằng bộ xử lớ p sẽ cập nhật những phần tử
qrrix i ,...,1,, += . Dấu * biểu thị tất cả cỏc cột.
Thuật toán song song JOR có thể chia thành các bước như sau như sau:
Bước 1: Khởi tạo: mỗi bộ xử lí nhận ω và tập hợp hàng pp qr : của ma trận A
và những phần tử pp qr : của véc tơ b;
Bước 2: Lặp: mỗi bộ xử lí Server p nhận )(kX , cập nhật nú và trả lại )1(
:
+k
qr Pp
X cho
bộ xử lí Master, nơi kiểm tra sự hội tụ.
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
41
3.3.3 Thuật toỏn song song SOR
Phương pháp SOR có sự phụ thuộc dữ liệu giữa )(kX và )1( +kX . Khi song song
hoá thuật toán đũi hỏi một số bộ xử lớ phải đợi trong khi giá trị của )1( +kX được
tính toỏn.
Ta sử dụng cụng thức lặp sau:
( ) bDXRDIXLDI kk 1)(1)1(1 )1()( −−+− +−−=+ ωωωω (3.3.3)
Đặt:
,
)1( +
=
kXY
( ) bDXRDIZ kk 1)(1)( )1( −− +−−= ωωω
Thỡ (3.3.7) trở thành:
)(1 )( kZYLDI =+ −ω
∑
−
=
=−=
1
1
)(
,...,1,0,
i
j
jij
ij
k
ii niya
a
zy ω (3.3.4)
Thuật toán SOR được chia thành bốn bước :
1. ( ) bDXRDIZ kk 1)(1)( )1( −− +−−← ωωω ;
2. Giải hệ )(1 )( kZYLDI =+ −ω sử dụng (3.3.7);
3. ;)1( YX k ←+
4. Lặp lại bước 1-3 cho đến khi X hội tụ.
Trong cách song song hoá thuật toán ở trên, bước 1 có thể phân tán ( theo hàng)
giữa những bộ xử lí theo cách tương tự như phương pháp sử dụng trong phần 3.3.1
cho phương pháp JOR. Giải pháp cho hệ tam giác dưới trong bước 2 là được thực
hiện tuần tự.
Sử dụng kí hiệu trong phần 3.2, chúng ta có thể viết lại bước 1 như sau:
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
42
1. ( ) bDxRDIz
pppppppppp qr
k
qrqrqr
k
qr
1
,*:
)(
:*,
1
,*:,*
)(
: :
)1( −− +−−← ωωω
với p= 1, 2, …, P, dấu * biểu thị tất cả cỏc hàng hoặc cột.
3.4 Chương trỡnh thử nghiệm
3.4.1 Bài toỏn mẫu
Lập trỡnh thử nghiệm thuật toỏn lặp Jacobi, JOR, SOR cho bài toỏn mẫu giải
hệ phương trỡnh đại số tuyến tính dạng (3.1.1) nhận được sau khi sai phân hóa
phương trỡnh Laplace với điều kiện biên Dirichlet với ma trận A và véc tơ b như
sau:
=
−
−−
−−
−
=
=
1
0
.
.
1
0
,
41
141
...
...
141
14
,
...
...
bB
BI
IBI
IBI
IB
A (3.4.5)
Trong tất cả các chương trỡnh ta sai số được sử dụng để kiểm tra sự hội tụ là
10-10 .
3.4.2 Đánh giá kết quả
Thuật toỏn Jacobi song song giải bài toỏn mẫu sai số là 10-10, giải với bậc của
ma trận A là 104 và 4.104.
Với bậc của ma trận A là 104 thời gian thực hiện thuật toán trên các node của
trung tâm tính toán hiệu năng cao với số node lần lượt là 1, 2 và 4, số tiến trỡnh lần
lượt là 1, 2, 4, 8, 16.
Số node 1 2 4
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
43
Số tiến trỡnh
1 15,899 s
2 13,473 s 19,129 s
4 16,328 s 17,608 s 19,122 s
8 29,966 s 25,251 s 23,526 s
16 1 m 06,535
s
44,004 s 41,709 s
Hỡnh 3.1: Thời gian thực hiện của thuật toỏn Jacobi song song
với bậc của ma trận A là 104
Ta nhận thấy chỉ duy nhất một lần thời gian thực hiện thuật toỏn Jacobi song
song với 1 node 2 tiến trỡnh nhanh hơn thời gian thực hiện với 1 tiến trỡnh, cú hệ
số gia tốc là 1,18. Lượng thời gian giảm đi do giảm được tính toán không bù đắp
nổi chi phí truyền thông khi có nhiều tiến trỡnh cựng tham gia. Mặt khỏc ta cũng
nhận thấy khi số tiến trỡnh càng ớt tăng số node thời gian sẽ tăng lên. Chứng tỏ
thời gian truyền thông giữa các node là đáng kể và lâu hơn thời gian truyền thụng
trờn một node. Khi số tiến trỡnh càng tăng thỡ sử dụng càng nhiều node thời gian
sẽ giảm đi đáng kể.
Bậc của ma trận A mà bằng 4.104 thỡ thời gian thực hiện như sau:
Số node
Số tiến trỡnh
1
2 4
1 4 m 22,930
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
44
s
2 2 m 40,256
s
2 m 53,667 s
4 2 m 40,055
s
2 m 22,296 s
2 m 12,572
s
8 3 m 40,030
s
2 m 57,010 s
2 m 04,943
s
16 6 m 16,950
s
4 m 23,142 s
3 m 03,719
s
Hỡnh 3.2: Thời gian thực hiện của thuật toỏn Jacobi song song
với cỡ của ma trận A là 4.104
Số node
Số tiến trỡnh
1
2 4
2 1,640 1,514
4 1,643 1,846 1,983
8 1,195 1,485 2,104
16 0,697 0.999 1,431
Hỡnh 3.2: Hệ số tăng tốc của thuật toán Jacobi song song
với bậc của ma trận A là 4.104
Rừ ràng khi bậc của ma trận A tăng lên, lượng tính toán tăng lên, lúc này khi
chia xẻ công việc giữa cỏc tiến trỡnh thỡ thời gian giảm đi do giảm đươc tính toán
đó lớn hơn rất nhiều thời gian truyền thông giữa các bộ xử lí và với số tiến trỡnh là
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
45
8 thực hiện trờn 4 node thỡ thời gian tớnh toỏn đó giảm hơn một nửa, hệ số gia tốc
đạt giá trị lớn nhất.
3.4.3 Định hướng phát triển
Tiếp tục đánh giá so sánh thời gian hiệu năng thực hiện của thuật toán JOR,
SOR song song với thuật toán Jacobi song song. Tỡm hiểu và thử nghiệm một số
phương pháp lặp khác để đưa về song song hoá giải hệ đại số tuyến tính, như R/B
SOR, JSOR, PSOR. Từ đó hoàn thiện hơn những nghiên cứu về thuật toán lặp song
song giải hệ đại số tuyến tính.
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
46
KẾT LUẬN
Khoá luận đó trỡnh bày sơ lược một số kiến thức tổng quan về xử lí song song
gồm kiến trúc song song, các thành phần chính của máy tính song song, thiết kế và
đánh giá một thuật toán song song và kiến trúc cụm máy tính của trung tâm tính
toán hiệu năng cao. Khoá luận cũng đó giới thiệu về giao diện truyền thụng điệp
MPI nhằm mục đích áp dụng lập trỡnh MPI với ngụn ngữ C cho bài toán giải hệ
đại số tuyến tính bằng phương pháp lặp. Nội dung chính của khoá luận là giới thiệu
một số phương pháp lặp giải hệ phương trỡnh đại số tuyến tính, đồng thời trỡnh
bày một số thuật toỏn lặp song song. Cuối cựng đưa ra được chương trỡnh thử
nghiệm và đánh giá những kết quả thu được bước đầu. Định hướng phát triển tiếp
theo là tiếp tục nghiên cứu các thuật toán lặp song song để hoàn thiện hơn đề tài
này.
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
47
TÀI LIỆU THAM KHẢO
1. Parallel overrlaxation algorithm for systems of linear equations – Rudnei
dias da Cunha, Tim Hopkins – UK
2. Designing and building parallel programs – Ian Fotster , 1995
3. Xử lí song song và phân tán – Đoàn Văn Ban - 2006
4.
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
48
PHỤ LỤC
Chương trỡnh thử nghiệm
1. Thuật toỏn Jacobi
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
49
Chương trỡnh:
#include
#include
#include
#define n 100 /* số điểm trong của lưới */
#define epsilon 0.0000000001 /* sai số */
int main(int argc, char **argv)
{
int rank,size,i,j,N,myn;
double *x,*subxnew,*subx,sum,temp,total;
MPI_Status status;
MPI_Init(&argc,&argv); /* Khởi tạo MPI */
/* Lấy hạng của cỏc tiến trỡnh */
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
/* Lấy số cỏc tiến trỡnh */
MPI_Comm_size(MPI_COMM_WORLD,&size);
if(rank==0)
{
N=n*n; /* số phần tử của véc tơ cột x */
x=(double*)malloc(N*sizeof(double)); /* kết quả */
myn=N/size; /* số phần tử x trong mỗi bộ xử lớ */
}
MPI_Bcast(&myn,1,MPI_INT,0,MPI_COMM_WORLD);
MPI_Bcast(&N,1,MPI_INT,0,MPI_COMM_WORLD);
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
50
/* myn+2*n phần tử x(k+1) trong cỏc bộ xử lớ khởi tạo giỏ trị =0*/
subx=(double*)malloc((myn+(2*n))*sizeof(double));
for(i=0;i<(myn+2*n);i++)
subx[i]=0;
/* myn phần tử x(k+1) trong cỏc bộ xử lớ khởi tạo giỏ trị =0*/
subxnew=(double*)malloc((myn)*sizeof(double));
for(i=0;i<myn;i++)
subxnew[i]=0;
do
{
/* bộ xử lớ hạng rank gửi n phần tử cho bộ xử lớ hạng rank-1 */
if(rank>0)
MPI_Send(subx+n,n,MPI_DOUBLE,rank-1,rank, MPI_COMM_WORLD);
/* bộ xử lớ hạng rank gửi n phần tử cho bộ xử lớ hạng rank+1 */
if(rank<size-1)
MPI_Send(subx+myn,n,MPI_DOUBLE,rank+1,rank,
MPI_COMM_WORLD);
/* bộ xử lớ hạng rank nhận n phần tử từ bộ xử lớ hạng rank+1 */
if(rank<size-1)
MPI_Recv(subx+myn+n,n,MPI_DOUBLE,rank+1,rank+1,MPI_COMM_W
ORLD,&status);
/* bộ xử lớ hạng rank nhận n phần tử từ bộ xử lớ hạng rank-1 */
if(rank>0)
MPI_Recv(subx,n,MPI_DOUBLE,rank-1,rank-1,MPI_COMM_WORLD,
&status);
/* Tớnh subxnew từ subx */
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
51
MPI_Allreduce(&sum,&total,1,MPI_DOUBLE,MPI_SUM,
MPI_COMM_WORLD); /* tớnh sai số*/
}
while (total>epsilon);/* lặp khi chưa thoả món sai số */
MPI_Gather(subxnew,myn,MPI_DOUBLE,x,myn,MPI_DOUBLE,0,
MPI_COMM_WORLD); /* kết quả */
MPI_Finalize(); /* đóng môi trường MPI */
return 0;
}
2. Thuật toỏn JOR
Chương trỡnh JOR tương tự như Jacobi nhưng khác phần công thức tính toán
do có thêm tham số ω .
3.Thuật toỏn SOR
Chương trỡnh viết cho thuật toỏn SOR:
#include
#include
#include
#define w 1 /*khai bao tham so ω */
#define n 256 /* số điểm trong của lưới */
#define epsilon 0.0000000001 /* sai số */
int main(int argc, char **argv)
{
int rank,size,i,j,k,N,myn;
double *x,*y,*subxnew,*subx,sum,temp,total;
MPI_Status status;
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
52
MPI_Init(&argc,&argv); /* Khởi tạo MPI */
/* Lấy hạng của cỏc tiến trỡnh */
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
/* Lấy số cỏc tiến trỡnh */
MPI_Comm_size(MPI_COMM_WORLD,&size);
if(rank==0)
{
N=n*n; /* số phần tử của véc tơ cột x */
x=(double*)malloc(N*sizeof(double));/* x(k+1) */
y=(double*)malloc(N*sizeof(double)); /* x(k) */
myn=N/size; /* số phần tử x trong mỗi bộ xử lớ */
}
MPI_Bcast(&myn,1,MPI_INT,0,MPI_COMM_WORLD);
MPI_Bcast(&N,1,MPI_INT,0,MPI_COMM_WORLD);
/* myn+n phần tử x(k+1) trong cỏc bộ xử lớ khởi tạo giỏ trị =0*/
subx=(double*)malloc((myn+n)*sizeof(double));
for(i=0;i<myn;i++)
subx[i]=0;
/* myn phần tử x(k+1) trong cỏc bộ xử lớ */
subxnew=(double*)malloc((myn)*sizeof(double));
do
{
/* bộ xử lớ hạng rank gửi n phần tử cho bộ xử lớ hạng rank-1 */
if(rank>0)
MPI_Send(subx+n,n,MPI_DOUBLE,rank-1,rank, MPI_COMM_WORLD);
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
53
/* bộ xử lớ hạng rank nhận n phần tử từ bộ xử lớ hạng rank+1 */
if(rank<size-1)
MPI_Recv(subx+myn+n,n,MPI_DOUBLE,rank+1,rank+1,MPI_COMM_W
ORLD,&status);
/* tính subxnew từ subx sử dụng bước 1 thuật toán */
MPI_Gather(subxnew,myn,MPI_DOUBLE,y,myn,MPI_DOUBLE,0,
MPI_COMM_WORLD);
if(rank==0)
/* tớnh x(k+1) từ y theo bước 2 của thuật toán */
MPI_Scatter(x,myn,MPI_DOUBLE,subxnew,myn,MPI_DOUBLE,0,
MPI_COMM_WORLD);
/* tớnh sai số */
MPI_Allreduce(&sum,&total,1,MPI_DOUBLE,MPI_SUM,
MPI_COMM_WORLD);
}
while (total>epsilon); /* lặp khi chưa thoả món sai số */
MPI_Finalize(); /* đóng môi trường MPI */
return 0;
}
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
K
IL
O
BO
O
K
S.
CO
M
54
BẢNG CÁC CHỮ VIẾT TẮT
SISD Single Instruction Single Data
SIMD Single Instruction Multiple Data
MISD Multiple Instruction Single Data
MIMD Multiple Instruction Multiple Data
CPU Central Processing Unit
UMA Uniform Memory Access
NUMA NonUniform Memory Access
RAM Random Access Memory
PRAM Parallel Random Access Memory
CR Concurent Read
CW Concurent Write
ER Exclusive Read
EW Exclusive Write
COMA Cache – Only Memory Access
WS Workstation
WSC Workstation Cluster
HPC High Performance Computing
TCP Transmission Control Protocol
UDP User Datagram Protocol
MPI Message Passing Interface
JOR Jacobi Overrelaxation
SOR Successive Overrelaxation
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
Các file đính kèm theo tài liệu này:
- Một số phương pháp song song cho hệ đại số tuyến tính.pdf