Professional Documents
Culture Documents
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
toán
Biết sử dụng ngôn ngữ lập trình C++.
-1-
Chương 1: Tổng quan về tính toán song song
-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ớ
Bộ xử lý
Luồng Luồng
Luồng lệnh kết quả dữ liệu
Bộ nhớ
-3-
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.
-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 Phần tử
xử lý 1
Thực hiện tuần tự hai tiến trình phải qua 8 giai đoạn:
-5-
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:
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 toán tuần tự là: 2*(S1 + S2 + S3+ S4)
Tổng thời gian tính toán hình ống là: S1 + S2 + S3+ S4 + S4
CU
ALU
ALU
...
ALU
Bộ nhớ
-6-
Dữ liệu vào
Systolic Tín hiệu Controller Host
Array Processor
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 vuông
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.
-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
a22
a21
a11 a12
1
b11
2 3
b12 b21
4 5 6
Nhập theo cột b22
7 8 9 c21
c22
c12
c11
-8-
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)
Main Memory
Fixed Disks
Tăng khả
năng lưu trữ
Magnetic Tapes
-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 toá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 toán song song.
Những thuật toá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
- 11 -
2. Ví dụ về thiết kế thuật toá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 toán
song song trên nhiều máy tính, điều quan trọng nhất là tìm được thuật toán thích
hợp. Nhiều khi sự phụ thuộc tính toá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:
an = α n (α n −1an − 2 + β n −1 ) + β n = α nα n −1an − 2 + β n + α n β n −1
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 toá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 toá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 toá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
- 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 toá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).
4. Ví dụ vê thiết kế thuật toán song song bằng phương pháp chia để trị
Tính toá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 toà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 vuông. 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; k<n; k++) -- mỗi lần reo
là một lần ta có được 2 số (x,y). Lệnh rand() cho ta một số nguyên 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 vuông 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à quá 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
toà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 toán song song cho bài toá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 <stdio.h>
#include <stdlib.h> #include <stdlib.h>
void main() void main()
{ {
float x,y; float x,y;
unsigned int k,n, c1=0; unsigned int k,n, c2=0;
n =10000; n =10000;
for (k=0; k<=n;k++) for (k=0; k<=n;k++)
{ {
x= (float) rand()/RAND_MAX; x= (float) rand()/RAND_MAX;
y= (float) rand()/RAND_MAX; y= (float) rand()/RAND_MAX;
if (x*x+y*y<=1) c1++; if (x*x+y*y<=1) c2++;
} }
send(c1); 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);
}
Cho biết thiết bị tính toán của chúng ta là một mạng gồm 3 máy tính.
1/ ∆ 4∆
Chúng ta sẽ giao cho mỗi máy tính tính một phần của tổng ∑ 2
,
k = 0 1 + ( k∆ )
rồi nhận lại kết quả. Giả thiết hệ thống có 3 BXL
4∆
Máy thứ nhất tính tổng các số hạng ứng với các giá trị k chia hết
1 + ( k∆ ) 2
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 -
1 1 1
Máy một tính tổng 4 ∆1 + + + ... +
1 + 3 2 ∆2 1 + 6 2 ∆2 1 + 99 2 ∆2
1 1 1
4 ∆ + + ... +
2 2
Máy hai tính tổng
2 2 2
1 + ∆ 1+ 4 ∆ 1 + 100 ∆
1 1 1
4 ∆ + + ... +
2 2
Máy ba tính tổng
2 2 2 2
1 + 2 ∆ 1+ 5 ∆ 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 toá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 -