Yêu cầu
Chương trình sau khi tối ưu phải tương
đương
Tốc độthực hiện trung bình tăng
Hiệu quả đạt được tương xứng với công sức
bỏra
Có thểtối ưu mã vào lúc nào
Mã nguồn- do người lập trình (giải thuật)
Mã trung gian
Mã đích
8 trang |
Chia sẻ: Mr Hưng | Lượt xem: 1064 | Lượt tải: 0
Nội dung tài liệu Kĩ thuật lập trình - Bài 13: Tối ưu mã, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
21/1/2010
1
Bài 13
Tối ưu mã
Mở đầu
Yêu cầu
Chương trình sau khi tối ưu phải tương
đương
Tốc độ thực hiện trung bình tăng
Hiệu quả đạt được tương xứng với công sức
bỏ ra
Có thể tối ưu mã vào lúc nào
Mã nguồn- do người lập trình (giải thuật)
Mã trung gian
Mã đích
Tối ưu cục bộ
1. Kỹ thuật để cải tiến mã đích một cách cục bộ.
2. Một phương pháp để cải tiến chương trình đích bằng cách xem xét một
dãy lệnh trong mã đích và thay thế chúng bằng những đoạn mã ngắn hơn
và hiệu quả hơn
Xu hướng chính
1. Loại bỏ lệnh dư thừa
2. Thông tin dòng điều khiển
3. Giản lược biểu thức đại số
4. Sử dụng các đặc trưng ngôn ngữ
Tối ưu cục bộ
Tính toán biểu thức hằng
x := 32 trở thành x := 64
x := x + 32
Mã không đến được
goto L2
x := x + 1 Å Không cần
Tối ưu dòng điều khiển
goto L1 trở thành goto L2
L1: goto L2 Å Không cần nếu không còn lệnh
sau L2
21/1/2010
2
Tối ưu cục bộ
Giản lược biểu thức đại số
x := x + 0 Å Không cần
Mã chết
x := 32 Å x không được dùng trong
những lệnh tiếp theo
y := x + y Æ y := y + 32
Giảm chi phí tính toán
x := x * 2 Æ x := x + x
Æ x := x << 2
Tối ưu trong từng khối cơ sở
1. Loại bỏ biểu thức con chung
2. Tính giá trị hằng
3. Copy Propagation
4. Loại mã chết
Ví dụ: a[i+1] = b[i+1]
Loại biểu thức con chung
t1 = i+1
t2 = b[t1]
t3 = i + 1
a[t3] = t2
t1 = i + 1
t2 = b[t1]
t3 = i + 1 Å Không cần
a[t1] = t2
i = 4
t1 = i+1
t2 = b[t1]
[t1] t2
i = 4
t1 = 5
t2 = b[t1]
[t1] t2
i là hằng
i = 4
t1 = 5
t2 = b[5]
a[5] = t2a = a =
i = 4
t2 = b[5]
a[5] = t2
Mã nhận được:
21/1/2010
3
Tối ưu trên DAG
Vấn đề cần quan tâm
Loại bỏ biểu thức con chung
Tính các biểu thức hằng
Loại mã chết
Loại những dư thừa cục bộ
Ứng dụng một phương pháp tối ưu dẫn
đến việc tạo ra những đoạn mã có thể ứng
dụng phương pháp tối ưu khác.
Tối ưu vòng đơn giản
Phương pháp
Chuyển những đoạn mã bất biến ra ngoài vòng
lặp.
Ví dụ:
while (i <= limit - 2)
Chuyển thành
t := limit - 2
while (i <= t)
Mã ba địa chỉ của Quick Sort
i = m - 1
j = n
t1 =4 * n
v = a[t1]
i = i + 1
t2 = 4 * i
1
2
3
4
5
6
t7 = 4 * I
t8 = 4 * j
t9 = a[t8]
a[t7] = t9
t10 = 4 * j
a[t10] = x
16
17
18
19
20
21
t3 = a[t2]
if t3 < v goto (5)
j = j – 1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto (9)
if i >= j goto (23)
t6 = 4 * i
x = a[t6]
7
8
9
10
11
12
13
14
15
goto (5)
t11 = 4 * I
x = a[t11]
t12 = 4 * i
t13 = 4 * n
t14 = a[t13]
a[t12] = t14
t15 = 4 * n
a[t15] = x
22
23
24
25
26
27
28
29
30
Khối cơ bản (basic block)
Chuỗi các lệnh kế tiếp nhau trong đó ̣dòng điều khiển
đi vào lệnh đầu tiên của khối và ra ở lệnh cuối cùng
của khối mà không bị dừng hoặc rẽ nhánh.
Ví dụ
t1 := a * a
t2 := a * b
t3 := 2 * t2
t4 := t1 + t2
t5 := b * b
t6 := t4 + t5
21/1/2010
4
Giải thuật phân chia các khối cơ bản
Input: Dãy lệnh ba địa chỉ.
Output: Danh sách các khối cơ bản với mã lệnh ba địa chỉ của
từng khối
Phương pháp:
1. Xác định tập các lệnh đầu (leader), của từng khối cơ bản
i) Lệnh đầu tiên của chương trình là lệnh đầu.
ii) Bất kỳ lệnh nào là đích nhảy đến của các lệnh GOTO có
hoặc không có điều kiện là lệnh đầu
iii) Bất kỳ lệnh nào đi sau lệnh GOTO có hoặc không có điều
kiện là lệnh đầu
2. Với mỗi lệnh đầu, khối cơ bản bao gồm nó và tất cả các lệnh
tiếp theo không phải là lệnh đầu hay lệnh kết thúc chương
trình
Ví dụ
(1) prod := 0
(2) i := 1
(3) t1 := 4 * i
(4) t2 := a[t1]
Lệnh (1) là lệnh đầu
theo quy tắc i,
Lệnh (3) là lệnh đầu
theo quy tắc ii
(5) t3 := 4 * i
(6) t4 := b[t3]
(7) t5 := t2 * t4
(8) t6 := prod + t5
(9) prod := t6
(10) t7 := i + 1
(11) i := t7
(12) if i<=20 goto (3)
Lệnh sau lệnh (12) là
lệnh đầu theo quy tắc
iii.
Các lệnh (1)và (2) tạo
nên khối cơ bản thứ
nhất.
Lệnh (3) đến (12) tạo
nên khối cơ bản thứ
hai.
Xác
định
khối
i = m - 1
j = n
t1 =4 * n
v = a[t1]
i = i + 1
t2 = 4 * i
t3 = a[t2]
1
2
3
4
5
6
7
t7 = 4 * I
t8 = 4 * j
t9 = a[t8]
a[t7] = t9
t10 = 4 * j
a[t10] = x
goto (5)
16
17
18
19
20
21
22
cơ
bản
if t3 < v goto (5)
j = j – 1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto (9)
if i >= j goto (23)
t6 = 4 * i
x = a[t6]
8
9
10
11
12
13
14
15
t11 = 4 * i
x = a[t11]
t12 = 4 * i
t13 = 4 * n
t14 = a[t13]
a[t12] = t14
t15 = 4 * n
a[t15] = x
23
24
25
26
27
28
29
30
DAGi = m - 1
j = n
t1 =4 * n
v = a[t1]
i = i + 1
t2 = 4 * i
t3 = a[t2]
t6 = 4 * i
x = a[t6]
t7 = 4 * i
t8 = 4 * j
t11 = 4 * i
x = a[t11]
t12 = 4 * i
t13 = 4 * n
B1
B2
B5 B6
if t3 < v goto B2
j = j – 1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
if i >= j goto B6
t9 = a[t8]
a[t7] = t9
t10 = 4 * j
a[t10] = x
goto B2
t14 = a[t13]
a[t12] = t14
t15 = 4 * n
a[t15] = x
B3
B4
21/1/2010
5
Loại biểu thức con chung
i = m - 1
j = n
t1 =4 * n
v = a[t1]
i = i + 1
t2 = 4 * i
t3 = a[t2]
t6 = 4 * i
x = a[t6]
t7 = 4 * i
t8 = 4 * j
t11 = 4 * i
x = a[t11]
t12 = 4 * i
t13 = 4 * n
B1
B2
B5 B6
if t3 < v goto B2
j = j – 1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
if i >= j goto B6
t9 = a[t8]
a[t7] = t9
t10 = 4 * j
a[t10] = x
goto B2
t14 = a[t13]
a[t12] = t14
t15 = 4 * n
a[t15] = x
B3
B4
Loại biểu thức con chungi = m - 1
j = n
t1 =4 * n
v = a[t1]
i = i + 1
t2 = 4 * i
t3 = a[t2]
t6 = 4 * i
x = a[t6]
t8 = 4 * j
t9 = a[t8]
t11 = 4 * i
x = a[t11]
t12 = 4 * i
t13 = 4 * n
B1
B2
B5 B6
if t3 < v goto B2
j = j – 1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
if i >= j goto B6
a[t6] = t9
t10= 4 * j
a[t10] = x
goto B2
t14 = a[t13]
a[t12] = t14
t15 = 4 * n
a[t15] = x
B3
B4
Loại biểu thức con chungi = m - 1j = n
t1 =4 * n
v = a[t1]
i = i + 1
t2 = 4 * i
t3 = a[t2]
t6 = 4 * i
x = a[t6]
t8 = 4 * j
t9 = a[t8]
t11 = 4 *i
x = a[t11]
t12 = 4 * i
t13 = 4 * n
B1
B2
B5 B6
if t3 < v goto B2
j = j – 1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
if i >= j goto B6
a[t6] = t9
a[t8] = x
goto B2
t14 = a[t13]
a[t12] = t14
t15 = 4 * n
a[t15] = x
B3
B4
Loại biểu thức con chungi = m - 1
j = n
t1 =4 * n
v = a[t1]
i = i + 1
t2 = 4 * i
t3 = a[t2]
t6 = 4 * i
x = a[t6]
t8 = 4 * j
t9 = a[t8]
t11 = 4 * i
x = a[t11]
t12 = 4 * i
t13 = 4 * n
B1
B2
B5 B6
if t3 < v goto B2
j = j – 1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
if i >= j goto B6
a[t6] = t9
a[t8] = x
goto B2
t14 = a[t13]
a[t12] = t14
t15 = 4 * n
a[t15] = x
B3
B4
21/1/2010
6
Loại biểu thức con chungi = m - 1
j = n
t1 =4 * n
v = a[t1]
i = i + 1
t2 = 4 * i
t3 = a[t2]
t6 = 4 * i
x = a[t6]
t8 = 4 * j
t9 = a[t8]
t11 = 4 * i
x = a[t11]
t13 = 4 * n
t14 = a[t13]
B1
B2
B5 B6
if t3 < v goto B2
j = j – 1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
if i >= j goto B6
a[t6] = t9
a[t8] = x
goto B2
a[t11] = t14
t15 = 4 * n
a[t15] = x
B3
B4
Loại biểu thức con chungi = m - 1
j = n
t1 =4 * n
v = a[t1]
i = i + 1
t2 = 4 * i
t3 = a[t2]
t6 = 4 * i
x = a[t6]
t8 = 4 * j
t9 = a[t8]
t11 = 4 * i
x = a[t11]
t13 = 4 * n
t [t ]
B1
B2
B5 B6
if t3 < v goto B2
j = j – 1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
if i >= j goto B6
a[t6] = t9
a[t8] = x
goto B2
14 = a 13
a[t11] = t14
a[t13] = x
B3
B4
Loại biểu thức con chungi = m - 1j = n
t1 =4 * n
v = a[t1]
i = i + 1
t2 = 4 * i
t3 = a[t2]
t6 = 4 * i
x = a[t6]
t8 = 4 * j
t9 = a[t8]
t11 = 4 * i
x = a[t11]
t13 = 4 * n
t [t ]
B1
B2
B5 B6
if t3 < v goto B2
j = j – 1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
if i >= j goto B6
a[t6] = t9
a[t8] = x
goto B2
14 = a 13
a[t11] = t14
a[t13] = x
B3
B4
Loại biểu thức con chungi = m - 1j = n
t1 =4 * n
v = a[t1]
i = i + 1
t2 = 4 * i
t3 = a[t2]
x = a[t2]
t8 = 4 * j
t9 = a[t8]
a[t2] = t9
t11 = 4 * i
x = a[t11]
t13 = 4 * n
t [t ]
B1
B2
B5 B6
if t3 < v goto B2
j = j – 1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
if i >= j goto B6
a[t8] = x
goto B2
14 = a 13
a[t11] = t14
a[t13] = x
B3
B4
21/1/2010
7
Loại biểu thức con chungi = m - 1j = n
t1 =4 * n
v = a[t1]
i = i + 1
t2 = 4 * i
t3 = a[t2]
x = t3
t8 = 4 * j
t9 = a[t8]
a[t2] = t9
t11 = 4 * i
x = a[t11]
t13 = 4 * n
t [t ]
B1
B2
B5 B6
if t3 < v goto B2
j = j – 1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
if i >= j goto B6
a[t8] = x
goto B2
14 = a 13
a[t11] = t14
a[t13] = x
B3
B4
Loại biểu thưc con chungi = m - 1j = n
t1 =4 * n
v = a[t1]
i = i + 1
t2 = 4 * i
t3 = a[t2]
x = t3
t9 = a[t4]
a[t2] = t9
a[t4] = x
t11 = 4 * i
x = a[t11]
t13 = 4 * n
t [t ]
B1
B2
B5 B6
if t3 < v goto B2
j = j – 1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
if i >= j goto B6
goto B2
14 = a 13
a[t11] = t14
a[t13] = x
B3
B4
Loại biểu thức con chungi = m - 1
j = n
t1 =4 * n
v = a[t1]
i = i + 1
t2 = 4 * i
t3 = a[t2]
x = t3
a[t2] = t5
a[t4] = x
goto B2
t11 = 4 * i
x = a[t11]
t13 = 4 * n
t [t ]
B1
B2
B5 B6
if t3 < v goto B2
j = j – 1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
if i >= j goto B6
14 = a 13
a[t11] = t14
a[t13] = x
B3
B4
Common Subexpression
Elimination
i = m - 1
j = n
t1 =4 * n
v = a[t1]
i = i + 1
t2 = 4 * i
t3 = a[t2]
x = t3
a[t2] = t5
a[t4] = x
goto B2
x = t3
t14 = a[t1]
a[t2] = t14
[t ]
B1
B2
B5 B6
if t3 < v goto B2
j = j – 1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
if i >= j goto B6
a 1 = x
B3
B4
Similarly for B6
21/1/2010
8
Loại mã chếti = m - 1
j = n
t1 =4 * n
v = a[t1]
i = i + 1
t2 = 4 * i
t3 = a[t2]
x = t3
a[t2] = t5
a[t4] = x
goto B2
x = t3
t14 = a[t1]
a[t2] = t14
[t ]
B1
B2
B5 B6
if t3 < v goto B2
j = j – 1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
if i >= j goto B6
a 1 = x
B3
B4
Loại mã chếti = m - 1
j = n
t1 =4 * n
v = a[t1]
i = i + 1
t2 = 4 * i
t3 = a[t2]
a[t2] = t5
a[t4] = t3
goto B2
t14 = a[t1]
a[t2] = t14
a[t1] = t3
B1
B2
B5 B6
if t3 < v goto B2
j = j – 1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
if i >= j goto B6
B3
B4
Giảm chi phíi = m - 1
j = n
t1 =4 * n
v = a[t1]
i = i + 1
t2 = 4 * i
t3 = a[t2]
a[t2] = t5
a[t4] = t3
goto B2
t14 = a[t1]
a[t2] = t14
a[t1] = t3
B1
B2
B5 B6
if t3 < v goto B2
j = j – 1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
if i >= j goto B6
B3
B4
Giảm chi phíi = m - 1
j = n
t1 =4 * n
v = a[t1]
t2 = 4 * i
t4 = 4 * j
t2 = t2 + 4
a[t2] = t5
a[t4] = t3
goto B2
t14 = a[t1]
a[t2] = t14
a[t1] = t3
B1
B2
B5 B6
t3 = a[t2]
if t3 < v goto B2
t4 = t4 - 4
t5 = a[t4]
if t5 > v goto B3
if i >= j goto B6
B3
B4
Các file đính kèm theo tài liệu này:
- unit13_compatibility_mode__8445.pdf