Transcript
Page 1: Compiler Optimization

TỐI ƯU HÓA MÃCODE OPTIMZATION

Sinh Viên : Trần Văn Bằng. Bùi Ngọc Sơn.

Lớp : Khoa học máy tínhGiảng Viên : Nguyễn Thu Hương

Page 2: Compiler Optimization

1. Giới thiệu về tối ưu hóa mã

Tối ưu hóa mã• Giới thiệu tối ưu hóa mã được thực hiện trong giai đoạn

nào của quá trình dịch? Tại sao• Nói thêm rằng: Tối ưu hóa ở đây dùng chưa chuẩn, bài

toán tối ưu hóa thực sự là bài toán NP-khó, chúng ta chỉ cố gắng làm tốt đến mức nào đó có thể

• Slide này chỉ bàn đến vấn đề tối ưu hóa chung nhất, tức là machine-independent và language-independent

Page 3: Compiler Optimization

1. Giới thiệu về tối ưu hóa mã

• Các yêu cầu khi tối ưu hóa mã

Page 4: Compiler Optimization

2. Các nguồn tối ưu hóa

Nội Dung:

2.1 Loại bỏ biểu thức con chung

(Common subexpression elimination)

2.2 Lan truyền sao chép

(Copy propagation)

2.3 Loại bỏ mã chết

(Dead code elimination)

2.4 Ráp hằng

(Constant Folding)

2.5 Tối ưu hóa vòng khuyên

Page 5: Compiler Optimization

2.1. Loại Bỏ Biểu Thức Con Chung

• Định nghĩa: Biểu thức con chung là

Page 6: Compiler Optimization

2.2. Lan Truyền Sao Chép

Page 7: Compiler Optimization

2.3. Loại Bỏ Mã Chết

Page 8: Compiler Optimization

2.4. Ráp Hằng

• Ráp hằng (constant folding) là kỹ thuật tối ưu hóa mã dễ hiểu nhất, tuy nhiên, lại đạt được hiệu quả khá tốt.

• Ý tưởng của Ráp hằng: thay việc tính toán các hằng số bằng kết quả tính của chúng.

• Ví dụ: câu lệnh gán

x = 45 * 88;

• Với trình biên dịch không tối ưu hóa, mỗi lần chạy sẽ thực hiện phép nhân 2 số.

• Tối ưu hóa: tại thời điểm dịch, sẽ tính 45 * 88 = 3960, gán luôn x = 3960 vào mã đích.

Page 9: Compiler Optimization

2.4 Hiệu quả của Ráp hằng

Ví dụ khác: tính địa chỉ 1 phần tử trong mảng

• Cho mảng 2 chiều N x M số nguyên, mỗi số nguyên chiếm k byte, địa chỉ cơ sở của mảng là B. Chỉ số từ 0.

• Tính địa chỉ của phần tử trên dòng i, cột j:

Address = B + j * k + i * k * M

• Trong nhiều trường hợp, chỉ số dòng hoặc chỉ số cột là cố định. Giả sử chỉ số cột j = const. Khi đó

Address = B + X + i * Z (X = j * k, Z = k * M)

Address = Y + i * Z (Y = B + X)

• Tiết kiệm 2 phép nhân và 1 phép cộng

Page 10: Compiler Optimization

2.4 Nhận xét

• Ráp hằng chỉ thực hiện được với những biến được xác định là hằng số ngay từ giai đoạn dịch.

• Một trình biên dịch thực hiện ráp hằng tốt?– Tính toán biểu thức A * x * B với A, B là hằng số, x là biến số

– Chưa tốt: (A * x) * B hoặc A * (x * B) => không thể ráp hằng

– Tốt: giao hoán (A * B) * x => ráp hằng.

Page 11: Compiler Optimization

2.5. Tối Ưu Hóa Vòng Khuyên

• Vòng khuyên: hay còn gọi là vòng lặp (loop).• Thời gian chạy của chương trình phần lớn là dành cho

việc thực hiện các vòng khuyên, đặc biệt là các vòng khuyên trong (trong các vòng khuyên lồng nhau)

=> Tối ưu hóa vòng khuyên rất quan trọng.• Các phương pháp sử dụng trong tối ưu hóa vòng khuyên:

Di chuyển mã (Code Motion): Loại bỏ biến quy nạp (Induction variable) và Thu giảm lực

(Reduce in strength)

Page 12: Compiler Optimization

2.5.1. Di chuyển mã

• Ý tưởng: chuyển mã ở vòng khuyên trong ra các vòng khuyên ngoài, làm giảm số lượng mã trong vòng khuyên

• Phép biến đổi này lấy (các) biểu thức có kết quả độc lập với số lần vòng khuyên được thực thi và đặt (các) biểu thức đó ra ngoài vòng khuyên. Thường là đặt lên trước, cũng có thể đặt xuống sau nếu không làm thay đổi kết quả chương trình.

• Làm giảm thời gian tính toán các biểu thức, thời gian truy cập bộ nhớ, cấp phát biến v.v…

Page 13: Compiler Optimization

2.5.1. Ví dụ

• Xét đoạn mã sau:

while (j < maximum – 1){

j = j + (4 + array[k]) * pi + 5;

}• Áp dụng 2 cải thiện mã:

real maxval = maximum - 1;

real calcval = (4 + array[k]) * pi + 5;

while (j < maxval) {

j = j + calcval;

}

• Lập trình viên tốt vs lập trình viên tồi

Page 14: Compiler Optimization

2.5.2. Biến quy nạp và thu giảm lực

• Thu giảm lực: thay một phép biến đổi tốn kém bằng một phép toán hiệu quả hơn: – phép * thay bằng phép + , dịch bit.– Sử dụng lại các kết quả tính toán trước đó.– …

• Ví dụ for (i=0; i < 10; i++) {

j = 17 * i;

}

• Thay bằng j = 0;

for (i=0; i < 10; ++i) {

j = j + 17;

}

Page 15: Compiler Optimization

2.5.2. Biến quy nạp và thu giảm lực

• Biến quy nạp được định nghĩa đệ quy như sau:– là những biến có giá trị thay đổi một lượng cố định trong mỗi lần

lặp. Ví dụ for (i = 0; i < n; i++) thì i là biến quy nạp.– Những biến là một hàm tuyến tính của một biến quy nạp khác.

Ví dụ, với i là biến quy nạp; j = 17 * i thì j là biến quy nạp

• Induction Variable: Khi có 2 hay nhiều biến quy nạp trong 1 vòng, ta có thể bỏ bớt các biến này ra khỏi vòng lặp.

• Loại bỏ biến quy nạp và thu giảm lực thường được kết hợp với nhau.

Page 16: Compiler Optimization

2.5.2. Ví dụ

• Xét đoạn code sau:global sum;

int i, j = 5;

for (i = 0; i < n; i++) {

j += 2;

sum += j;

}

• i, j là các biến quy nạp. Áp dụng việc loại bỏ biến quy nạp:global sum;

int i;

for (i = 0; i < n; i++) {

sum += (5 + 2 * i);

}

• Thu giảm lực: biểu thức sum += (5 + 2 * i);

Chuyển thành: sum += (5 + i << 1);

Page 17: Compiler Optimization

1. Các Giải Thuật Biến Đổi Cải Thiện Mã

Nội Dung:

3.1 Các khái niệm có liên quan

3.2 Loại bỏ biểu thức con chung(Lý Thuyết & Giải Thuật đưa ra và ví dụ minh họa)

3.3 Lan truyền sao chép

3.4 Di chuyển mã.

3.5 Loại bỏ các biến quy nạp & thu giảm lực

Page 18: Compiler Optimization

3.1 Các Khái Niệm Liên Quan

Page 19: Compiler Optimization

3.2 Loại Bỏ Biểu Thức Con Chung

Page 20: Compiler Optimization

3.3 Lan Truyền Sao Chép

Page 21: Compiler Optimization

3.4 Di Chuyển Mã

Page 22: Compiler Optimization

3.5 Loại Bỏ Các Biến Quy Nạp &Thu Giảm Lực

Page 23: Compiler Optimization

4. Kết Luận

• Điểm mạnh• Điểm cần khắc phục• Các hướng mở rộng

Page 24: Compiler Optimization

Lời mở đầu

• Ngày nay đa số các chương trình dịch đều hỗ trợ việc tối ưu hóa mã.

• Tuy nhiên có những chương trình dịch không hỗ trợ, ví dụ như TurboPascal 5.0

• Nghiên cứu về tối ưu hóa mã giúp cho chúng ta, những lập trình viên, đặc biệt là lập trình viên hệ thống có khái niệm về tối ưu hóa mã và viết được những đoạn mã tối ưu hơn, chạy nhanh hơn.


Top Related