Trên một Pentium hiện đại, nó không còn có thể đưa ra gợi ý phân nhánh cho bộ xử lý. Giả sử rằng một trình biên dịch profiling như gcc với tối ưu hóa hướng dẫn profile có thông tin về hành vi phân nhánh có khả năng, nó có thể làm gì để tạo ra mã sẽ thực thi nhanh hơn?Trình biên dịch có thể làm gì với thông tin phân nhánh?
Tùy chọn duy nhất tôi biết là di chuyển các nhánh không chắc đến hết chức năng. Có gì khác?
Cập nhật.
http://download.intel.com/products/processor/manual/325462.pdf khối lượng 2a, mục 2.1.1 nói
"tiền tố Chi nhánh gợi ý (2EH, 3EH) cho phép một chương trình để đưa ra một gợi ý để xử lý về đường dẫn mã có khả năng nhất cho một chi nhánh. Sử dụng các Chỉ sử dụng các tiền tố chi nhánh có điều kiện khác (Jcc). Việc sử dụng các tiền tố gợi ý chi nhánh khác và/hoặc các mã opcodes không xác định khác với hướng dẫn Intel 64 hoặc IA-32 được đặt trước;
Tôi không biết liệu những điều này có thực sự có hiệu lực hay không.
Mặt khác, 3.4.1. . Của http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf nói
" Trình biên dịch tạo ra mã để cải thiện hiệu quả của dự đoán rẽ nhánh trong bộ vi xử lý Intel Intel C++ Compiler hoàn thành điều này bằng cách:
- đang lưu giữ và dữ liệu trên các trang riêng biệt
- sử dụng có điều kiện hướng dẫn di chuyển để loại bỏ các chi nhánh
- mã tạo phù hợp với thuật toán dự đoán nhánh tĩnh
- nội tuyến nếu thích hợp
- unrolling nếu số lần lặp lại là có thể dự đoán
Với tối ưu hóa từng cấu hình hướng dẫn, trình biên dịch có thể đặt ra các khối cơ bản để loại bỏ các chi nhánh cho hầu hết đường thường xuyên thực hiện một chức năng hoặc ít nhất là cải thiện khả năng dự báo của họ. Chi nhánh dự đoán cần không phải là mối quan tâm ở cấp nguồn. Để biết thêm thông tin, hãy xem tài liệu về Trình biên dịch Intel C++. "
http://cache-www.intel.com/cd/00/00/40/60/406096_406096.pdf nói trong 'Cải tiến hiệu suất với PGO'
" PGO việc tốt nhất cho mã với nhiều chi nhánh thường xuyên thực hiện mà khó có thể dự đoán tại thời gian biên dịch. Ví dụ là mã có kiểm tra lỗi chuyên sâu trong đó các điều kiện lỗi là sai phần lớn thời gian. Mã lỗi xử lý lỗi (không thường xuyên) được thực hiện có thể được di dời để nhánh này hiếm khi được dự đoán không chính xác. Giảm thiểu đang lạnh xen kẽ vào thường xuyên thực hiện (nóng) mã cải thiện hướng dẫn bộ nhớ cache hành vi."
Bạn có biết trình biên dịch nào thực sự thực hiện bất kỳ việc nào trong số những thứ này không? Ví dụ, gcc? – marshall