5

Tôi đã đọc kỹ các kỹ thuật biên dịch tối ưu hóa cục bộ nhưng tôi vẫn không hiểu cách chúng được triển khai. Ý tưởng là trình tối ưu hóa xem xét 'cửa sổ' của mã mỗi lần và bằng cách nào đó phát hiện các mẫu và thay thế chúng bằng các phiên bản được tối ưu hóa hơn.Các mẫu tối ưu hóa lổ nhìn trộm

Câu hỏi của tôi là, làm cách nào để khám phá các mẫu này? (giả sử nền tảng của bạn là một máy ảo xuất ra mã lắp ráp cho một máy tính được tạo sẵn, như Hack của Schocken).

Mọi người có thực sự kiểm tra mã theo cách thủ công (sử dụng Biểu đồ kiểm soát hoặc DAG hoặc bất kỳ thứ gì) và sau đó thu thập tất cả các mẫu đã xác định và mã hóa chúng vào trình tối ưu hóa không? Hoặc là có một cách tự động.

Ví dụ: bạn cung cấp mã được tối ưu hóa trong một máy phân tích và nó rút ra các mẫu đã nói. Nếu vậy, làm sao người ta có thể bắt đầu viết một?

+0

Tôi nghĩ điều này thường được gọi là 'lưu vào bộ nhớ cache nội tuyến '. Bạn sẽ tìm thấy nhiều tài liệu cho các công cụ JavaScript gần đây sử dụng kỹ thuật này khi chạy. Xem http://wingolog.org/archives/2012/05/29/inline-cache-applications-in-scheme. – leppie

+0

Thật thú vị, lần đầu tiên tôi gặp phải vấn đề này. Tôi thường suy nghĩ cho các hoạt động như giảm cường độ, đánh giá liên tục, kiểm soát luồng lựa chọn, vv .. – gfountis

+0

Điều này dường như được nhắm mục tiêu tại 'thời gian chạy' có? Hoặc là nó được sử dụng để tạo ra mã lắp ráp chặt chẽ hơn? – gfountis

Trả lời

3

Tối ưu hóa lổ nhìn trộm cổ điển không phải là về giảm cường độ mạnh và những thứ khác bạn đặt tên. Họ là 2-3 chuỗi hướng dẫn ví dụ như

BRANCH FALSE $1 
BRANCH $2 
$1: 

có thể được giảm xuống còn

BRANCH TRUE $2 

Trình tự như thế này có thể phát sinh trong máy phát mã ngây thơ như đi kèm với trình biên dịch đơn-pass mà không làm tạo ra các AST, chẳng hạn như một số trình biên dịch COBOL mà tôi đã làm việc.

+0

Tôi hiểu, nhưng làm thế nào người ta có thể khám phá các trình tự này? có danh sách các mẫu được xuất bản ở đâu đó không? Mọi người có biên dịch mã ngẫu nhiên và sau đó bắt đầu tự tìm kiếm chúng không? – gfountis

+0

Ngoài ra, đó không phải là ví dụ về tối ưu hóa luồng kiểm soát?=) – gfountis

+1

@gfountis Chắc chắn đó là nhưng các trình biên dịch tôi đang nói về không phân tích lưu lượng. Các trình tự lổ nhìn trộm sẽ hiển nhiên đối với bất kỳ lập trình viên lắp ghép nào, nếu có bất kỳ trình tự nào còn lại. Bạn chỉ cần kiểm tra đầu ra và nghĩ 'hmm ...'. Đây là tất cả trong những cuốn sách thông thường. – EJP

1

Tùy thuộc vào bạn có nên viết máy phân tích của riêng bạn hoặc sử dụng bộ phân tích hiện tại hay không. Trong cả hai trường hợp, máy phân tích của bạn tiếp tục kiểm tra mã cho đến khi nó không tối ưu hóa. Nếu bạn lấy ví dụ về GCC, nó có các đường chuyền cụ thể để tối ưu hóa. Mã trung gian của chương trình của bạn được cung cấp cho các lượt thực hiện cái này và thực hiện tối ưu mã của bạn. Ngoài ra bất kỳ vượt qua có thể thực hiện nhiều hơn một lần.
Nếu bạn thực sự muốn trải qua cách viết các tối ưu hóa này, chỉ cần đi qua các tệp .h trong GCC.

+0

Vì vậy, trong trường hợp muốn tối ưu hóa cho việc tạo mã không x86 (đối với nền tảng đồ chơi), cách duy nhất là viết phân tích của riêng bạn hoặc làm bằng tay "" phải không? – gfountis

+0

Câu hỏi đặt ra là về tối ưu hóa lổ nhìn trộm, và bạn chưa trả lời. – EJP