Làm thế nào tôi có thể yêu cầu GCC hủy bỏ một vòng lặp cụ thể? Tôi đã sử dụng SDK CUDA nơi các vòng lặp có thể được bỏ theo cách thủ công bằng cách sử dụng #pragma unroll
. Có tính năng tương tự cho gcc không? Tôi googled một chút nhưng không thể tìm thấy bất cứ điều gì.Yêu cầu gcc đặc biệt mở một vòng lặp
Trả lời
GCC cung cấp cho bạn một vài cách khác nhau để xử lý này:
Sử dụng #pragma chỉ, như
#pragma GCC optimize ("string"...)
, như đã thấy trong số GCC docs. Lưu ý rằng pragma làm cho các tối ưu hóa toàn cầu cho các chức năng còn lại. Nếu bạn sử dụng#pragma push_options
vàpop_options
macro khéo léo, bạn có thể có thể xác định khoảng này chỉ là một chức năng như vậy:#pragma GCC push_options #pragma GCC optimize ("unroll-loops") //add 5 to each element of the int array. void add5(int a[20]) { int i = 19; for(; i > 0; i--) { a[i] += 5; } } #pragma GCC pop_options
Chú thích chức năng cá nhân với cú pháp thuộc tính của GCC: kiểm tra GCC function attribute tài liệu cho một luận án chi tiết hơn về các môn học. Một ví dụ:
//add 5 to each element of the int array. __attribute__((optimize("unroll-loops"))) void add5(int a[20]) { int i = 19; for(; i > 0; i--) { a[i] += 5; } }
Lưu ý: Tôi không chắc chắn như thế nào tốt GCC là unrolling vòng ngược lặp (tôi đã làm nó để có được Markdown để chơi đẹp với mã của tôi). Các ví dụ nên biên dịch tốt, mặc dù.
Rất hay mà có một thuộc tính chức năng cho điều này, tuy nhiên nó bị bỏ qua bởi GCC mới nhất của Apple cho iOS: "cảnh báo: 'tối ưu hóa' chỉ thị thuộc tính bị bỏ qua". (Tôi biết họ đã chuyển sang LLVM nhưng tôi vẫn sử dụng GCC đôi khi, vì đôi khi nó tạo ra mã nhanh hơn.) Bất kỳ ai biết tại sao nó bị bỏ qua? Chi nhánh GCC của Apple có quá cũ không? Trên một lưu ý phụ, trong các chức năng mà tôi đã sử dụng nó, các vòng được unrolled anyway miễn là tôi sử dụng -O3. – Simplex
Tôi vừa thử '__attribute __ ((tối ưu hóa (" unroll-loops ")))' với một số mã nhúng và nó cải thiện tốc độ chỉ 3%. Tự động unrolling 8 lần cải thiện tốc độ 12% và không tăng kích thước chương trình càng nhiều. – endolith
Gcc của tôi cho biết cảnh báo: bỏ qua #pragma tối ưu hóa ... Tính năng này luôn khả dụng? – neodelphi
-funroll-loops
có thể hữu ích (mặc dù nó bật tính năng hủy vòng lặp trên toàn cầu, không phải trên mỗi vòng lặp). Tôi không chắc liệu có một #pragma
làm như vậy ...
nah Tôi cũng tìm thấy điều đó, nhưng tôi muốn chỉ đăng ký một vòng lặp cụ thể – Nils
bmei từ broadcom có một tập hợp các bản vá lỗi để thêm hỗ trợ "#pragma unroll" vào gcc. – osgx
@ Jerry Coffin, Tôi có thể sử dụng nó như thế nào? Bạn có thể cho tôi một lệnh sử dụng vòng lặp -funroll không? –
Tôi không thể tin rằng tôi sẽ nói điều này. Nếu bạn không tìm thấy bất cứ điều gì khác luôn luôn có ... Thiết bị của Duff. Bây giờ, nơi * đã làm * Tôi đặt lash của Penitent? Tôi biết xung quanh nó ở đâu đó ... – dmckee
Heh bạn có thể làm điều đó bằng cách sử dụng macro? Có lẽ không, vì vậy chỉ cần viết nó ra là điều duy nhất còn lại? – Nils
Trong tất cả sự nghiêm túc, tôi khuyên bạn nên xem xét việc biên dịch riêng biệt một chút với '-funroll-loops' trước khi sử dụng thiết bị của Duff: đó là một điều tuyệt vời để nghiên cứu, nhưng một điều xấu xí có trong mã của bạn. – dmckee