2011-01-22 12 views
5

Tôi biết một số CPU cố gắng dự đoán các câu lệnh chi nhánh khi quyết định mã nào cần tìm nạp trước, tôi đã tự hỏi liệu có cách nào giúp mã hóa hay khó mã dự đoán nhánh trong C# (hoặc C++). Một ví dụ sẽ là một lỗi kiểm tra nếu tuyên bố mà tôi biết sẽ trả về sai 99,9999999% thời gian, tôi muốn nói với CPU để luôn luôn mong đợi rằng chi nhánh không bao giờ xảy ra cho mục đích tìm nạp trước.Truyền đạt kiến ​​thức chuyên môn để dự đoán các câu lệnh chi nhánh trong C# hoặc C++

Cảm ơn.

+0

Tại sao bạn cảm thấy điều này là cần thiết? –

+3

ngày hôm nay trong vi tối ưu hóa đi hoang dã, chúng tôi trình bày .. – BrokenGlass

+0

@chibacity một số lần nó có thể rất quan trọng và cung cấp cho một số tăng hiệu suất. Nhưng hầu hết các CPU hoàn toàn mới có các dự đoán nhánh khá tốt với bộ nhớ cache lịch sử lớn. – Elalfer

Trả lời

5

Theo sự hiểu biết tốt nhất của tôi, không có giải pháp đa nền tảng cho vấn đề này. Tôi hy vọng rằng C# VM sẽ thực hiện một số loại phân tích thời gian chạy để tối ưu hóa cho các loại dự đoán này, mặc dù tôi không biết điều này cho một thực tế.

Đối với C/C++, có một vài công cụ nền tảng cụ thể để giúp tối ưu hóa điều này. Bạn thường có thể tìm thấy trình tối ưu hóa được hướng dẫn bởi hồ sơ cho mã. Tôi biết một thực tế là gcc và g + + hỗ trợ điều này, và rằng nó có thể tạo ra một sự khác biệt khá lớn trong hiệu suất chương trình ròng. gcc cũng hỗ trợ một phần mở rộng trình biên dịch cụ thể được gọi là __builtin_expect cho phép bạn hardcode trong giả định của bạn về dự đoán rẽ nhánh:

if (__builtin_expect(x == 0, 0)) { // Unlikely to occur 
    /* ... */ 
} 
+0

Câu hỏi này mô tả cách tối ưu hóa hướng dẫn hồ sơ với g ++: http://stackoverflow.com/ câu hỏi/4365980/cách sử dụng-profile-hướng dẫn-tối ưu hóa-in-g – JaredC

Các vấn đề liên quan