2009-11-22 21 views
5

Tôi biết rằng -O1 sẽ tự động bật một số cờ nhất định. Những cờ này có thể được bật theo cách thủ công. Nếu tôi không chỉ định -O1, bạn vẫn có thể tối ưu hóa -O1 bằng cách chỉ định tất cả các cờ mà -O1 bật.Cách tối ưu hóa gcc -O1 mà không chỉ định -O1

tôi đã cố gắng

-fthread-jumps -fcprop-registers -fguess-branch-probability 

nhưng nó vẫn không làm tối ưu hóa -O1. Tôi có thể biết khi nào tôi sử dụng gprof vì hiệu suất không tốt.

Tôi sẽ bật cờ nào để tối ưu hóa -O1?

+8

Tôi nên bật cờ nào để tối ưu hóa -O1? Bạn bật -O1. Bật thủ công mỗi lá cờ là một sự lãng phí thời gian của bạn và dễ bị lỗi. Chỉ cần sử dụng các phím tắt các chàng trai GCC đã cho bạn thay vì làm những việc theo cách khó khăn !!! – Glen

+0

Xem thêm: http://stackoverflow.com/questions/1778698/. –

Trả lời

13

Một cách để tìm hiểu:

gcc -O1 -c -Q -v dummy.c 

(trong đó dummy.c là tên tệp của bạn.) Điều này làm cho gcc để spew các cờ được sử dụng để dòng lệnh.

Chỉnh sửa: Vui lòng xem kastauyra's answer về điều này. Có vẻ như bạn không thể mô phỏng đầy đủ tối ưu hóa -O1 chỉ với một mình -f cờ.

0

Điều này tùy thuộc vào phiên bản gcc của bạn. Xem số gcc manpage.

Trên máy tính của tôi, -O (đó là -O1) bật tối ưu hóa sau đây:

-fauto-inc-dec -fcprop-registers -fdce -fdefer-pop -fdelayed-branch 
    -fdse -fguess-branch-probability -fif-conversion2 -fif-conversion 
    -finline-small-functions -fipa-pure-const -fipa-reference 
    -fmerge-constants -fsplit-wide-types -ftree-builtin-call-dce 
    -ftree-ccp -ftree-ch -ftree-copyrename -ftree-dce 
    -ftree-dominator-opts -ftree-dse -ftree-fre -ftree-sra -ftree-ter 
    -funit-at-a-time 

    -O also turns on -fomit-frame-pointer on machines where doing so 
    does not interfere with debugging. 
3

Từ hướng dẫn:

-O 
-O1 
Optimize. Optimizing compilation takes somewhat more time, and a lot more memory for a large function. 

With -O, the compiler tries to reduce code size and execution time, without performing any optimizations that take a great deal of compilation time. 

-O turns on the following optimization flags: 
      -fauto-inc-dec 
      -fcprop-registers 
      -fdce 
      -fdefer-pop 
      -fdelayed-branch 
      -fdse 
      -fguess-branch-probability 
      -fif-conversion2 
      -fif-conversion 
      -fipa-pure-const 
      -fipa-reference 
      -fmerge-constants 
      -fsplit-wide-types 
      -ftree-builtin-call-dce 
      -ftree-ccp 
      -ftree-ch 
      -ftree-copyrename 
      -ftree-dce 
      -ftree-dominator-opts 
      -ftree-dse 
      -ftree-forwprop 
      -ftree-fre 
      -ftree-phiprop 
      -ftree-sra 
      -ftree-pta 
      -ftree-ter 
      -funit-at-a-time 
+2

Có các cờ nội bộ khác không thể được "bật" để mô phỏng đầy đủ '-O1'. – LiraNuna

11

Thật không may, điều đó là không thể. Có rất nhiều cờ tối ưu hóa cá nhân được bật bởi -O1, đúng, tuy nhiên rất nhiều mã trong GCC kiểm tra giá trị cờ tối ưu hóa toàn cầu và thực hiện tối ưu hóa không được chỉ định bởi bất kỳ tùy chọn -f .. nào.

+0

hmm đó là tin cho tôi .. có thể báo doc? – int3

+3

Tài liệu không nói rằng (có lẽ một bản vá để thay đổi điều này sẽ được chấp nhận). Nhưng điều này có thể được nhìn thấy từ mã nguồn (kiểm tra số lượng địa điểm nếu (tối ưu> 0) ... mà không kiểm tra cờ riêng lẻ), cũng điều này đã được yêu cầu trên danh sách gửi thư của GCC: http: //gcc.gnu. org/ml/gcc-help/2008-02/msg00389.html –

+7

"Không phải tất cả các tối ưu hóa đều được kiểm soát trực tiếp bởi một lá cờ. Chỉ những tối ưu hóa có cờ mới được liệt kê trong phần này. Hầu hết các tối ưu hóa chỉ được bật nếu một -O cấp độ được đặt trên dòng lệnh. Nếu không, chúng sẽ bị vô hiệu hóa, ngay cả khi cờ tối ưu hóa riêng được chỉ định. "từ: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html – Dan

1

Bạn cũng có thể thử sử dụng pragma này (nó đòi hỏi GCC> = 4.4):

#pragma GCC optimize opt_list 
void f() 

pragma này cho phép bạn bật và tắt tối ưu hóa đặc biệt cho chức năng nhất định. opt_list là danh sách các tùy chọn -f * mà không có -f.

Ngoài ra còn có chức năng thuộc tính để thay đổi mức độ tối ưu hóa:

int f() __attribute__((optimize(1))); 

Bạn cũng có thể thay đổi mức độ tối ưu hóa toàn cầu (áp dụng cho tất cả các chức năng tiếp theo):

#pragma GCC optimize 1 
#pragma GCC optimize 0 

Bạn cũng có thể sử dụng (áp dụng đối với tất cả các chức năng tiếp theo):

#pragma GCC optimization_level n 

và cho trình biên dịch Intel C (); chỉ áp dụng cho chức năng tiếp theo)

#pragma intel optimization_level n 
Các vấn đề liên quan