Tải bản đầy đủ (.pdf) (18 trang)

Bài giảng tính toán song song

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (587.64 KB, 18 trang )

TRƯỜNG ĐẠI HỌC QUY NHƠN
KHOA KỸ THUẬT VÀ CÔNG NGHỆ
-----  -----

BÀI GIẢNG
TÍNH TỐN SONG SONG

Bộ mơn: Điện tử - Viễn thông

Tài liệu lưu hành nội bộ


TÍNH TỐN SONG SONG
Mục đích:
Tổng quan về xử lý song song
Các phương pháp thiết kế thuật toán song song
Các vấn đề trong xử lý song song
Một số công cụ xử lý song song (Pthread POSIX, MPI, …)

Yêu cầu:
Có kiến thức cơ bản về hệ thống: HĐH và mạng; Có khả năng tư duy thuật
tốn
Biết sử dụng ngơn ngữ lập trình C++.

Tài liệu tham khảo:
[1] Al Geist, Adam Bequelin, et al., PVM: Parallel Virtual Machine, A User's
Guide
and
Toturial
for
NetWorked


Parallel
Computing,
/>[2] Introduction to Parallel computing
/>[3] IBM Parallel Enviroment Manuals
http://www_1.ibm.com/servers/eserver/pseries/library/sp_books
[4] MPI Tutorial
/>[5] Programming with POSIX pthreads
/>[6] POSIX pthreads programming
/>[7]Al Geist, Adam Bequelin, et al., PVM: Parallel Virtual Machine, A User's Guide
and
Toturial
for
NetWorked
Parallel
Computing,
/>
-1-


Chương 1: Tổng quan về tính tốn song song
I. Phân loại kiến trúc máy tính song song
1) Giới thiệu chung
Tại sao phải xử lý song song?
Yêu cầu thực tế cần thực hiện khối lượng tính tốn lớn: bài tốn xử lý ảnh 3D,
thăm dị dầu khí, dự báo thời tiết, ... (máy tính xử lý tuần tự kiểu von Neumann là
không đáp ứng yêu cầu)
Xử lý song song là quá trình xử lý gồm nhiều tiến trình được kích hoạt đồng
thời và cùng tham gia giải quyết một bài toàn, nói chung xử lý song song được
thực hiện trên những hệ thống đa bộ xử lý.
Phân biệt xử lý song song với tuần tự:

Trong tính tốn tuần tự với một BXL thì tại mỗi thời điểm chỉ thực hiện được
một phép tốn.
Trong tính tốn song song thì nhiều BXL cùng kết hợp với nhau để giải quyết
cùng một bài toán cho nên giảm được thời gian xử lý vì mỗi thời điểm có thể thực
hiện đồng thời nhiều phép tốn.
Mục đích của xử lý song song: là thực hiện tính toán nhanh trên cơ sở sử
dụng nhiều BXL đồng thời. Cùng với tốc độ xử lý nhanh hơn, việc xử lý song song
cũng sẽ giải được những bài toán phức tạp u cầu khối lượng tính tốn lớn
Ba yếu tố chính dẫn đến việc xây dựng các hệ thống xử lý song song:
Tốc độ xử lý của các BXL theo kiểu von Neumann đã dần tiến tới giới hạn,
không thể cải tiến thêm được do vậy dẫn tới đòi hỏi phải thực hiện xử lý song song.
Hiện nay giá thành của phần cứng (CPU) giảm mạnh, tạo điều kiện để xây
dựng những hệ thống có nhiều BXL với giá thành hợp lý.
Sự phát triển của cơng nghệ mạch tích hợp (VLSI) cho phép tạo ra những hệ
thống có hàng triệu transistor trên một chip.
Vấn đề xử lý song song liên quan trực tiếp đến: kiến trúc máy tính, phần
mềm hệ thống (hệ điều hành), thuật tốn và ngơn ngữ lập trình, v.v.
Hệ thống tính song song: là một tập các BXL (thường là cùng một loại) kết
nối với nhau theo một kiến trúc nào đó để có thể hợp tác với nhau trong hoạt động
và trao đổi dữ liệu được với nhau.
Chúng ta dễ nhận thấy là độ phức tạp của xử lý song song sẽ lớn hơn xử lý
tuần tự rất nhiều, và tập trung chủ yếu ở phương diện trao đổi dữ liệu và đồng bộ
các tiến trình.
Để cài đặt các thuật toán song song trên các máy tính song song chúng ta phải
sử dụng những ngơn ngữ lập trình song song. Nhiều ngơn ngữ lập trình song song
đang được sử dụng như: Fortran 90, Pthread với Fortran/C++, MPI với C/C++,
PVM với C/C++, OpenMP với C/C++, v.v.
-2-



2) Kiến trúc của máy tính
Máy tính được xây dựng từ các khối cơ sở:
Bộ nhớ: để lưu trữ dữ liệu
Các đơn vị logic và số học: thực hiện các phép toán được ký hiệu là ALU
Các phần tử điểu khiển:Bộ điều khiển CU và các thiết bị vào/ra dữ liệu
Các Bus trao đổi dữ liệu.
Cách thức liên kết các khối trên với nhau cho ta biết kiến trúc của máy tính.
Trong các hệ thống máy tính thơng thường có hai khối quan trọng nhất là bộ nhớ và
BXL. BXL xử lý dữ liệu được lưu trữ trong bộ nhớ thông qua các chỉ thị (các câu
lệnh). Các câu lệnh cũng được lưu trong bộ nhớ. Trong hệ thống dữ liệu được thực
hiện theo cả hai chiều, đọc và ghi vào bộ nhớ. Hình 1-1 mơ tả hoạt động của mơ
hình máy tính kiểu von Neumann.
Bộ nhớ
Câu lệnh

Ghi dữ liệu

Đọc dữ liệu

Bộ xử lý
Hình 1-1 Sự liên kết giữa bộ nhớ và bộ xử lý

3) Phân loại kiến trúc máy tính
Dựa vào các đặc tính về số lượng BXL, số chương trình thực hiện, cấu trúc bộ
nhớ, v.v., Michael Flynn (1966) đã phân máy tính thành 4 loại sau:
Mơ hình SISD (Simple Instruction Simple Data): Đơn chỉ lệnh, đơn dữ
liệu
Máy tính loại SISD chỉ có một CPU, ở mỗi thời điểm thực hiện một chỉ lệnh và chỉ
đọc, ghi một mục dữ liệu. Tất cả các máy tính SISD chỉ có một thanh ghi register được
gọi là bộ đếm chương trình (program counter) được sử dụng để nạp địa chỉ của lệnh tiếp

theo và kết quả là thực hiện theo một thứ tự xác định của các câu lệnh. Hình 1-2 mơ tả
hoạt động của máy tính theo mơ hình SISD.
Đơn vị
điều khiển

Tín hiệu
điều khiển

BXL
Luồng
kết quả

Luồng lệnh
Bộ nhớ
Hình 1-2. Mơ hình của kiến trúc SISD

-3-

Luồng
dữ liệu


Mơ hình SISD cịn được gọi là SPSD (Simple Program Simple Data), đơn
chương trình và đơn dữ liệu. Đây chính là mơ hình máy tính kiểu von Neumann.

Mơ hình SIMD (Simple Instruction Multiple Data ): Đơn chỉ lệnh, đa dữ
liệu
Máy tính loại SIMD có một đơn vị điều khiển để điều khiển nhiều đơn vị xử lý
(nhiều hơn một đơn vị) thực hiện theo một luồng các câu lệnh. CU phát sinh tín
hiệu điều khiển tới tất cả các phần tử xử lý, những BXL này cùng thực hiện một

phép toán trên các mục dữ liệu khác nhau, nghĩa là mỗi BXL có luồng dữ liệu
riêng. Hình 1-3 mơ tả hoạt động của máy tính theo mơ hình SIMD, cịn được gọi là
SPMD.
Đơn vị điều khiển (CU)
Tín hiệu
điều khiển
Phần tử
xử lý 1

Phần tử
xử lý 2

...

Tín hiệu
điều khiển
Phần tử
xử lý n

Hình 1-3. Mơ hình của kiến trúc SIMD
Mơ hình SIMD cịn được gọi là SPMD, đơn chương trình và đa dữ liệu. Đây
chính là mơ hình máy tính phổ biến có trên thị trường như: DAP và Connection
Machine CM-2.

-4-


Mơ hình MISD (Multiple Instruction Simple Data): Đa chỉ lệnh, đơn dữ
liệu
Máy tính loại MISD là ngược lại với SIMD. Máy tính MISD có thể thực hiện

nhiều chương trình (nhiều lệnh) trên cùng một mục dữ liệu, nên còn được gọi là
MPSD (đa chương trình, đơn dữ liệu).
Kiến trúc kiểu này có thể chia thành hai nhóm:
Lớp các máy tính gồm nhiều đơn vị xử lý (PU) khác nhau có thể nhận được
những chỉ lệnh khác nhau để thực hiện trên cùng một mục dữ liệu. Đây là kiến trúc
khó và hiện nay chưa có loại máy tính nào được sản xuất theo loại này.
Mơ hình của kiến trúc MISD được mơ tả như hình 1-4.
Luồng lệnh 1
CU 1

Luồng lệnh 2

CU 2
.
.
.

Luồng lệnh n

CU n

Phần tử
xử lý 1
Phần tử
xử lý 2
.
.
.

Luồng

dữ liệu

Phần tử
xử lý n

Hình 1-4. Mơ hình của kiến trúc MISD
Lớp các máy tính có các luồng dữ liệu được gửi tuần tự theo dãy các CPU
liên tiếp. Đây là loại kiến trúc hình ống, xem xét như sau:
Nguyên lý hình ống (pipelined) dựa vào phương pháp phân đoạn hoặc chia nhỏ
một tiến trình tính tốn thành một số đoạn nhỏ hơn để thực hiện trong các pha liên
tiếp. Tất cả các giai đoạn của một tiến trình được thực hiện tuần tự, khi thực hiện
xong thì bắt đầu thực hiện của tiến trình tiếp theo. Mỗi pha thực hiện xong sẽ gửi
kết quả cho pha tiếp theo. Như vậy, trong cách thực hiện theo nguyên lý hình ống,
khi một giai đoạn cơng việc đang thực hiện thì một giai đoạn khác có thể nạp dữ
liệu vào, và dữ liệu vào của giai đoạn này có thể là kết quả của giai đoạn trước nó.
Ví dụ, hình 1-5 mơ tả một tiến trình được phân thành 4 giai đoạn thực hiện
tuần tự, nhưng có thể thực hiện song song theo ngun lý hình ống để tăng tốc độ
tính tốn khi phải thực hiện nhiều tiến trình như thế.
Một tiến trình được chia thành 4 giai đoạn:
Pha 1

Pha 2

Pha 3

Pha 4

Thực hiện tuần tự hai tiến trình phải qua 8 giai đoạn:
Pha 1


Pha 2

Pha 3

Pha 1

Pha 4
-5-

Pha 2

Pha 3

Pha 4


Thực hiện theo hình ống hai tiến trình trên chỉ cần trải qua 5 giai đoạn:

Pha 1

Pha 2

Pha 3

Pha 4

Pha 1

Pha 2


Pha 3

Pha 4

Hình 1-5 Thực hiện tuần tự và hình ống của hai tiến trình gồm 4 giai đoạn
Nếu ký hiệu Si là thời gian cần thiết để thực hiện giai đoạn thứ i thì:
Tổng thời gian tính tốn tuần tự là: 2*(S1 + S2 + S3+ S4)
Tổng thời gian tính tốn hình ống là: S1 + S2 + S3+ S4 + S4
CU
ALU
ALU
...
ALU

Bộ nhớ

Hình 1-6 Xử lý hình ống theo ALU
*) Các bộ xử lý mảng tâm thu SAP (Systolic Array Processor)
Năm 1978 Kung và Leiserson đề xuất một loại kiến trúc được gọi là mảng tâm
thu (Systolic Array) cho những tính tốn đặc biệt. Mảng tâm thu viết tắt là SA, là
một mảng các đơn vị xử lý được kết nối cục bộ với nhau.
Trong mảng tâm thu SA, mỗi PE (Processing Element) được xem như một tế
bào (một ô trong mảng) bao gồm:
Một số thanh ghi (register)
Một bộ cộng (adder)
Các mạch điều khiển
Đơn vị logic-số học ALU.
Các ô lân cận có thể trao đổi dữ liệu với nhau.
Dựa vào SA người ta xây dựng kiến trúc SAP


-6-


Dữ liệu vào
Systolic
Array

Tín hiệu

Host
Processor

Controller

Kết quả
Hình 1-7. Kiến trúc bộ xử lý mảng tâm thu
Trong kiến trúc SAP nêu trên: bộ điều khiển (Controller) làm nhiệm vụ giao
diện cho BXL chính (Host Processor) và gửi các tín hiệu điều khiển quá trình
vào/ra dữ liệu cho SA. Hoạt động của hệ thống theo từng nhịp và lặp lại một cách
đều đặn để tận dụng được khả năng song song của tất cả các phần tử xử lý.
SA có thể tổ chức theo nhiều cấu hình tơpơ khác nhau. Hình 1-8 mơ tả một số
cấu hình phổ biến của SA.

(a)

(c)
(b)
Hình 1-8. Một số cấu hình phổ biến của mảng tâm thu:
(a) mảng tuyến tính, (b) mảng hình tam giác, (c) mảng hai chiều hình vng
Hiệu quả của SA phụ thuộc rất nhiều vào các đặc tính vào/ra của dữ liệu. Nó

sẽ rất hiệu quả đối với những bài toán mà số liệu đọc/ghi thực hiện với nhịp độ cao,
đều đều và liên tục như các bài toán xử lý ảnh, qui hoạch tuyến tính, v.v.
Ví dụ, xét bài tốn nhân hai ma trận cỡ 2 × 2: A * B = C
a11

a12

a21

a22

*

b11

b12

c11

c12

b21

b22 =

c21

c22

Hiển nhiên Cij = ∑aik*bkj (k=1,2)


-7-


Chúng ta có thể thiết kế SA có 9 PE () để thực hiện nhân hai ma trận trên như sau:
Nhập theo hàng
a11
b11
b12 b21
Nhập theo cột

a22
a21
a12

1
2

3

4

5

6

7

8


9

b22

c21
c22

c12

c11

Hình 1-9. Kiến trúc SA để thực hiện nhân hai ma trận.
Năm 1986 Intel kết hợp với Kung đã xây dựng một hệ máy tính kiểu SAP đặt
tên là iWrap System, version sau được cải tiến vào năm 1990. Trong những năm
1990 cịn có seri máy tính loại mini-super của Convex Computer Corporation được
xây dựng từ những bộ CPU 64 bit được gắn với bộ nhớ chung.
Mơ hình MIMD (Multiple Instruction Multiple Data): Đa luồng lệnh, đa
luồng dữ liệu
Máy tính loại MIMD cịn gọi là đa BXL, trong đó mỗi BXL có thể thực hiện
những luồng lệnh (chương trình) khác nhau trên các luồng dữ liệu riêng.
Hầu hết các hệ thống MIMD đều có bộ nhớ riêng và cũng có thể truy cập vào
được bộ nhớ chung (global) khi cần, do vậy giảm thiểu được thời gian trao đổi dữ
liệu giữa các BXL trong hệ thống.
Đây là kiến trúc phức tạp nhất, nhưng nó là mơ hình hỗ trợ xử lý song song
cao nhất và đã có nhiều máy tính được sản xuất theo kiến trúc này, ví dụ: BBN
Butterfly, Alliant FX, iSPC của Intel, v.v.
Mơ hình của kiến trúc MIMD được mơ tả như hình 1-10
Hình 1-10. Mơ hình của kiến trúc MIMD
Luồng lệnh 1
CU 1


CU 2

Luồng lệnh 2

.
.
.
CU n

Luồng lệnh n

-8-

Phần tử
xử lý 1
Phần tử
xử lý 2
.
.
.
Phần tử
xử lý n

Luồng dữ
liệu 1
Luồng dữ
liệu 2

Luồng dữ

liệu n


4) Song song hóa trong máy tính tuần tự
Các hệ thống bộ nhớ phân cấp
Tốc độ thực hiện các phép toán trong BXL nhanh hơn rất nhiều so với việc
truy cập vào bộ nhớ;
Tốc độ truy cập vào bộ nhớ trong (RAM) nhanh hơn rất nhiều so với việc truy
cập vào bộ nhớ ngoài.
Hệ thống bộ nhớ phân cấp như thế có thể mơ tả như hình 1-11
CPU (Registers)
Cache

Tăng về tốc
độ truy cập

Main Memory

Fixed Disks
Tăng khả
năng lưu trữ
Magnetic Tapes
Hình 1-11. Hệ thống bộ nhớ phân cấp
Các thanh ghi được sử dụng trực tiếp cho ALU. Bộ nhớ cache được xem như
vùng đệm giữa BXL và bộ nhớ chính. Sự song song hóa trong sự trao đổi dữ liệu
theo cấu trúc phân cấp là cách khai thác chung để cải tiến hiệu quả xử lý của hệ
thống. Ví dụ, trong khi dữ liệu được lấy từ bộ nhớ ngoài vào bộ nhớ chính thì đồng
thời có thể gửi dữ liệu từ cache vào cho CPU.
Đa chương trình và chia sẻ thời gian
Các hệ điều hành của máy tính đơn bộ xử lý cho phép thực hiện song song

dựa vào cách tiếp cận phần mềm.
Trong cùng một khoảng thời gian, có nhiều tiến trình cùng truy cập vào dữ
liệu từ những thiết bị vào/ra chung (VD:Cổng giao tiếp, Đĩa cứng, CD, …). Chúng
ta biết rằng phần lớn các chương trình đều có hai phần: phần vào/ra và các thành
phần tính tốn trong quá trình xử lý. Các hệ điều hành đa chương trình luân phiên
thực hiện các chương trình khác nhau.
Để thực hiện việc này HĐH sử dụng Bộ lập lịch chia sẻ thời gian làm nhiệm
vụ phân chia CPU cho mỗi tiến trình một khoảng thời gian cố định theo phương
pháp quay vịng trịn. Bằng cách đó, tất cả các tiến trình đều được sẵn sàng để thực
hiện trên cơ sở được phép sử dụng CPU và những tài nguyên khác của hệ thống.

-9-


Do vậy, về nguyên tắc việc phát triển những chương trình song song trên máy
đơn BXL thực hiện được nếu có hệ điều hành cho phép nhiều tiến trình thực hiện,
nghĩa là có thể xem hệ thống như là đa bộ xử lý

Bài tập
1.1 Nêu đặc trưng cơ bản của kiến trúc máy tính tuần tự của von Neumann
1.2 Các kiến trúc máy tính có thể được phân loại như thế nào? dựa vào những yếu
tố nào để phân loại?
1.3 Một hệ thống như thế nào được gọi là máy tính song song?
1.4 Máy tính kiểu MIMD khác với mạng các máy tính như thế nào?
1.5 Nêu nguyên lý xử lý theo hình ống. Những bài tốn có những tính chất gì thì
thích hợp với kiến trúc xử lý hình ống?
1.6 Cần bao nhiêu nhịp để thực hiện nhân hai ma trận 100×100 trên SAP có
100×100 phần tử xử lý? Nếu sử dụng hệ 1000×1000 PE thì hệ nào tốt hơn (nhanh
hơn)?
1.7 Một công việc được chia thành m công việc con, mỗi cơng việc con địi hỏi một

đơn vị thời gian để thưc hiện. Hỏi cần bao nhiêu đơn vị thời gian để hệ thống hình
ống gồm k-bộ xử lý tuyến tính (gồm m-pha thực hiện) thực hiện được n nhiệm vụ
cho trước?

- 10 -


II. Thiết kế thuật toán song song
1. Nguyên lý thiết kế thuật toán song song
Như trên đã nêu ở trên, khi xử lý song song ta phải xét cả kiến trúc máy tính
và các thuật tốn song song.
Những thuật tốn, trong đó có một số thao tác có thể thực hiện đồng thời được
gọi là thuật toán song song.
Để thiết kế được các thuật toán song song cần phải thực hiện:
-

Phân chia dữ liệu cho các tác vụ.

-

Chỉ ra cách truy cập và chia sẻ dữ liệu.

-

Phân các tác vụ cho các tiến trình (bộ xử lý).

-

Các tiến trình được đồng bộ ra sao


Có 5 ngun lý chính trong thiết kế thuật toán song song:
Các nguyên lý lập lịch: mục đích là giảm tối thiểu các bộ xử lý sử dụng trong
thuật tốn sao cho thời gian tính tốn là khơng tăng (xét theo khía cạnh độ phức
tạp).
Ngun lý hình ống: Nguyên lý này được áp dụng khi bài toán xuất hiện một
dãy các thao tác {T1, T2, . . ., Tn}, trong đó Ti+1 thực hiện sau khi Ti kết thúc.
Nguyên lý chia để trị: Chia bài toán thành những phần nhỏ hơn tương đối độc
lập với nhau và giải quyết chúng một cách song song.
Nguyên lý đồ thị phụ thuộc dữ liệu: Phân tích mối quan hệ dữ liệu trong tính
tốn để xây dựng đồ thị phụ thuộc dữ liệu và dựa vào đó để xây dựng thuật toán
song song.
Nguyên lý điều kiện tranh đua: Nếu hai tiến trình cùng muốn truy cập vào
cùng một mục dữ liệu chia sẻ thì chúng phải tương tranh với nhau, nghĩa là chúng
có thể cản trở lẫn nhau.
Ngồi những ngun lý nêu trên, khi thiết kế thuật toán song song ta cịn phải
chú ý đến kiến trúc của hệ thống tính tốn:
Kiến trúc tính tốn nào sẽ phù hợp với bài toán?
Những bài toán loại nào sẽ xử lý hiệu quả trong kiến trúc song song cho
trước?
Ví dụ: Những máy tính kiểu SIMD khơng thích hợp để giải các bài tốn, trong
đó có nhiều tiến trình dị bộ.
Ngược lại, máy tính kiểu MIMD lại không hiệu quả để giải quyết những bài
tốn trong đó có nhiều tiến trình cần phải đồng bộ.

- 11 -


2. Ví dụ về thiết kế thuật tốn song song bằng phân rã phụ thuộc dữ liệu
Quay trở lại vấn đề đặt ra ban đầu, muốn tận dụng được khả năng tính tốn
song song trên nhiều máy tính, điều quan trọng nhất là tìm được thuật tốn thích

hợp. Nhiều khi sự phụ thuộc tính tốn “giá trị sau được tính dựa vào giá trị trước”
có vẻ rất “bền”, nhưng ta vẫn “tách” nó ra để chia cho nhiều máy cùng thực hiện.
Sau đây là một ví dụ minh họa:
Bài tốn: Cho biết a 0 và α k ,β k với k = 1,2,3..., n = 2 m
=> tính a n = α n a n −1 + β n (1) với số BXL không giới hạn.
Việc giá trị a n phải tính tốn qua a n −1 khiến chúng ta có cảm giác là việc
tìm ra giá trị a n nhất định phải thực hiện tuần tự qua n bước. Tức là phải mất đúng
n= 2 m bước tính -- cho dù ta có thể huy động rất nhiều máy cùng tính đi chăng nữa.
Tuy nhiên sự việc lại khơng hẳn như vậy, ta chỉ cần có m bước tính mà thôi!
Để thấy được điều này chúng ta thực hiện biến đổi

an = α n (α n −1an − 2 + β n −1 ) + β n = α nα n −1an − 2 + β n + α n β n −1
Đặt λ n =
λ n (n=1,2,3,..) )
khi ấy

α n β n −1 + β n

(chỉ mất 1 bước tính để tìm ra

an = α nα n −1an − 2 + λn

(*)

Công thức (*) cho thấy là: chỉ cần biết a 0 là chúng ta có thể tính ra được tất
cả các giá trị a 2 , a 4 , a 6 ,..., a m , và như vậy chỉ thêm 1 bước tính nữa (sử dụng
2

nhiều máy cùng tính) là tính ra được tất cả các giá trị với chỉ số lẻ.
Cụ thể là, từ (1) =>


a2 n +1 = α 2 n +1a2 n + β 2 n +1 .

Ký hiệu Tm là số bước tính cần để tính ra tất cả 2 m giá trị

a1 , a 2 , a3 ,..., a 2m
Lưu ý là chỉ mất một bước tính là biết được tất cả các giá trị λ n . (Tính các
λ n trên nhiều máy).
Như vậy Tm = 2 + Tm −1

(2 bước tính:

a2m , a2m −1 )

Từ đây suy ra Tm = 2m .
Như vậy chúng ta không cần đến 2 m bước tính, mà chỉ cần có 2m bước.
Bài tập 1: Thiết kế thuật tốn song song tính giá trị tại điểm x của đa thức

Pn ( x ) = α n x n + α n −1x n −1 + ... + α 0 với n = 2 m .
- 12 -


3. Thuật toán sắp xếp so sánh và đổi chỗ
Một trong các thuật toán sắp xếp đơn giản nhất là thực hiện so sánh hai phần tử liền
kề với nhau và nếu chúng chưa theo thứ tự cần sắp thì đổi chỗ của chúng với nhau. Quá
trình này lặp lại cho đến khí khơng cịn cặp nào khơng thoả mãn thì dừng.
3.1. Thuật tốn tuần tự: sắp xếp mảng a[n] theo thứ tự tăng dần - nổi bọt –
buble sort
for(i=n-1; i > 0; i--)
for(j=0; j < i; i++){

k = j + 1;
if(a[j] > a[k]){
temp = a[j];
a[j] = a[k];
a[k] = temp;
}
}
}
3.2. Thuật tốn song song
Chúng ta có thể sử dụng n tiến trình kết hợp theo nguyên lý hình ống để sắp
xếp mảng a[n]. Hệ thống được chia thành hai pha: pha chẵn và pha lẻ.
Pha chẵn: các tiến trình được đánh số chẵn so sánh với những tiến trình tiếp
theo (tiến trình có số lẻ), nếu nó giữ phần tử lớn hơn thì đổi dữ liệu với tiến trình
đó.
Pha lẻ: các tiến trình có số lẻ hoạt động tương tự như trên.
Ví dụ: n = 8 và dãy số ban đầu là 4, 2, 7, 8, 5, 1, 3, 6.
Pha \ Tiến trình

P0

P1

P2

P3

P4

P5


P6

P7

0

4

2

7

8

5

1

3

6

1

2

4

7


8

1

5

3

6

2

2

4

7

1

8

3

5

6

3


2

4

1

7

3

8

5

6

4

2

1

4

3

7

5


8

6

5

1

2

3

4

5

7

6

8

6

1

2

3


4

5

6

7

8

7

1

2

3

4

5

6

7

8

Hình 2-1. Sắp xếp theo nguyên lý hình ống


- 13 -


Ở pha thứ 6 và 7, khơng có cặp nào phải đổi chỗ do vậy thuật toán dừng và
cho kết quả là một dãy được sắp xếp. Trong hình 5-4, mũi tên hai chiều đứt nét để
chỉ những cặp so sánh với nhau nhưng khơng cần đổi chỗ, cịn mũi tên nét liền là
phải đổi giá trị cho nhau.
Giả thiết dữ liệu được lưu ở những tiến trình chẵn là B và ở những tiến trình lẻ
là A. Thuật tốn song song theo hình ống được mơ tả trong mơ hình truyền thơng
điệp như sau:
* Pha chẵn
Pi, i = 0, 2, 4, ..., n-2 (chẵn)

Pi, i = 1, 3, 5, ..., n-3 (lẻ)

recv(&A, Pi+1);

send(&A, Pi-1);

send(&B, Pi+1);

recv(&B, Pi-1);

if(A > B) B = A;

if(A > B) A = B;

* Pha lẻ
Pi, i = 1, 3, 5, ..., n-3 (lẻ)


Pi, i = 0, 2, 4, ..., n-2 (chẵn)

send(&A, Pi+1);

recv(&A, Pi-1);

recv(&B, Pi+1);

send(&B, Pi-1);

if(A > B) A = B;

if(A > B) B = A;

}

}

Thuật toán này có độ phức tạp O(n).
Bài tập: Song song thuật tốn sx trộn, sx nhanh.

4. Ví dụ vê thiết kế thuật tốn song song bằng phương pháp chia để trị
Tính tốn số PI trên nhiều máy.
Người ta có thể tính được gần đúng giá trị của số π bằng
cách đếm số điểm rơi vào trong hình trịn đơn vị, mà các điểm
này được reo một cách ngẫu nhiên vào hình vuông ngoại tiếp.
Tỷ lệ của số điểm rơi vào bên trong hình trịn so với tồn bộ
số lượng điểm reo sẽ dần tiến tới tỷ lệ của diện tích hình trịn
so với hình vng. Một thí nghiệm như vậy có thể thực hiện
được trên máy tính. Ở đấy mỗi điểm được biểu diễn bởi hai số

– tọa độ (x,y) của nó.
Trình “reo” 20000 điểm -- ứng với vịng lặp “for k=0; klà một lần ta có được 2 số (x,y). Lệnh rand() cho ta một số ngun trong khoảng
[0..RAND_MAX]. Như vậy điểm (x,y) có tính chất 0≤x,y≤1, là điểm nằm trong góc
¼ của hình vng cạnh bằng 2 – ngoại tiếp hình trịn đơn vị. Để kiểm tra điểm (x,y)
có đúng là nằm trong hình trịn đơn vị khơng, ta kiểm tra hệ thức x 2 + y 2 ≤ 1 .
Sau đây là trình “reo” điểm, và qua đấy tính được giá trị số π ≈ 3.1

- 14 -


#include <stdio.h>
#include <stdlib.h>
void main()
{
float x,y;
unsigned int k,n, c=0;
n =20000;
for (k=0; k<=n;k++)
{
x= (float) rand()/RAND_MAX;
y= (float) rand()/RAND_MAX;
if (x*x+y*y<=1) c++;
}
printf("%5.3f",(float) 4*c/n);
}

Chúng ta nhận thấy ngay là q trình “reo” có thể coi như là gồm 2 lần. Lần
thứ nhất (A) reo 10000 điểm, và làn thứ hai (B) reo 10000 điểm. Việc reo này có thể
giao cho 2 máy tính cùng thực hiện một lúc – và như thế “thời gian” thực hiện việc

tính giá trị số π sẽ “nhanh” hơn. Tất nhiên là các kết quả của (A) và của (B) – gọi là
“worker”, người làm thuê, phải được gửi đến cho một người -- chúng ta gọi là
“server”, tức ông chủ.
Các worker cần phải kết nối với server để kết quả có thể gửi tới được.
Việc gửi-nhận thật ra là khơng đơn giản. Ví dụ như worker (A) và (B) cùng
gửi kết quả cho server thì server biết nhận của ai trước (A) hay (B)? Hoặc là nếu
server đang bận xử lý việc khác, mà các worker gửi kết quả tới, thì làm sao mà nó
nhận được? Vậy là phải có một môi trường đảm bảo cho việc gửi nhận này được an
tồn. Mơi trường mà chúng ta đề cập đến trong các bài giảng sau là MPI.
Trong mơ hình, worker tiến hành “reo” và đếm các điểm rơi vào trong hình
trịn. Sau đó chúng gửi kết quả về cho server bằng lệnh send(). Số lần mà server
nhận dữ liệu vào – tức là số lần phải dùng đến lệnh recieve() – chính bằng số lượng
các worker.
Bài tập 1: Thiết kế thuật tốn song song cho bài tốn tính tổng
S=x1+x2+…+xn (n chẵn)
Tuần tự: [1] S=x1
[2] S=S+x2
[3] S=S+x3

[n] S=S+xn
Giả sử hệ thống có n/2 BXL:
Nhịp 1: s1=x1+x2;s2= x3+x4;…
Nhịp 2: s1+s2;s3+s4;…

- 15 -


#include <stdio.h>
#include <stdlib.h>
void main()

{
float x,y;
unsigned int k,n, c1=0;

#include <stdio.h>
#include <stdlib.h>
void main()
{
float x,y;
unsigned int k,n, c2=0;

n =10000;
for (k=0; k<=n;k++)
{
x= (float) rand()/RAND_MAX;
y= (float) rand()/RAND_MAX;
if (x*x+y*y<=1) c1++;
}
send(c1);
}

n =10000;
for (k=0; k<=n;k++)
{
x= (float) rand()/RAND_MAX;
y= (float) rand()/RAND_MAX;
if (x*x+y*y<=1) c2++;
}
send(c2);
}


#include <stdio.h>
void main()
{ unsigned int c1,c2,c;
recieve(c1);
recieve(c2);
c=c1+c2;
printf("%5.3f",(float) 4*c/20000);
}

5) Song song hóa một thuật tốn tuần tự
Vẫn là mục tiêu tính giá trị số π nhưng thơng qua giới hạn

π = lim

1/ ∆



4∆

∆ → 0 k = 0 1 + ( k∆ ) 2

,

Cho biết thiết bị tính tốn của chúng ta là một mạng gồm 3 máy tính.
1/ ∆

Chúng ta sẽ giao cho mỗi máy tính tính một phần của tổng




4∆

2
k = 0 1 + ( k∆ )

,

rồi nhận lại kết quả. Giả thiết hệ thống có 3 BXL
Máy thứ nhất tính tổng các số hạng

4∆
1 + ( k∆ ) 2

ứng với các giá trị k chia hết

cho 3; máy thứ hai ứng với các giá trị k chia cho 3 dư 1; và máy thứ ba ứng với các
giá trị k chia cho 3 dư 2.
Chi tiết như sau:
- 16 -


Máy một tính tổng



1
1
1


4 ∆1 +
+
+ ... +
 1 + 3 2 ∆2 1 + 6 2 ∆2
1 + 99 2 ∆2 

Máy hai tính tổng

 1

1
1

4 ∆
+
+ ... +
2
2 2
2 2
1+ 4 ∆
1 + ∆
1 + 100 ∆ 

Máy ba tính tổng



1
1

1

4 ∆
+
+ ... +
2 2
2 2
2 2
1+ 5 ∆
1 + 2 ∆
1 + 98 ∆ 

Sau đây là trình minh họa cho ý tưởng trên. Lệnh thơng báo kết quả cho nhau
là reduce(). Giá trị của ∆ và số lượng máy được thơng báo khi chạy trình.

Bài tập
2.1 Dựa vào thuật toán Dijsktra để xây dựng thuật toán song song tìm đường đi
ngắn nhất trong đồ thị.
2.2 Dựa vào thuật toán Prim để xây dựng thuật toán song song tìm cây bao trùm
(cây khung) cực tiểu của đồ thị.
2.3 Xây dựng thuật tốn song song tìm kiếm trên đồ thị theo chiều rộng.
2.4 Xây dựng thuật toán song song tìm kiếm trên đồ thị theo chiều sâu.
2.5 Xây dựng thuật toán song song để thực hiện phép biến đổi Fourier nhanh.
2.6 Xây dựng thuật toán song song để tính tích phân theo cơng thức Sipmpson
b

I=

∫ f ( x)dx
a


=

δ
[f(a)+4f(a+δ)+2f(a+2δ)+ 4f(a+3δ)+2f(a+4δ)+…+4f(a+(n-1)δ)+f(b)],
3

với δ = (b-a)/n, n là một số nhẵn.

- 17 -



×