2017-11-22 58 views
7

Do một bài tập ở trường tôi phải chuyển đổi mã C++ thành assembly (ARMv8). Sau đó, tôi phải biên dịch mã C++ bằng cách sử dụng các tối ưu hóa -O0, -O1, -O2, -O3 và -Os của GCC, ghi lại thời gian và so sánh với thời gian thực thi của mã assembly của tôi. Vì, tôi nghĩ rằng tôi biết -O3 phải nhanh hơn -O1 và -O2. Tuy nhiên, tôi nhận được rằng -O2 là nhanh nhất, sau đó là -O1, -O3, -Os, -O0. Điều đó có bình thường không? (Thời gian tính toán là khoảng 30 giây).Thời gian thực hiện được tối ưu hóa

+2

Bản sao có thể có của [GCC: Sự khác biệt giữa -O3 và -Os] (https://stackoverflow.com/questions/19689014/gcc-difference-between-o3-and-os) – Bilkokuya

+0

Tôi nên thêm điều đó trong khi câu hỏi Tôi đã gắn cờ không hỏi cụ thể về -O2, nó được trả lời bằng câu trả lời được chấp nhận ở đó. – Bilkokuya

+2

Tiêu đề câu hỏi của bạn đề cập đến thời gian biên dịch, nhưng văn bản câu hỏi của bạn có vẻ quan tâm nhiều hơn đến thời gian thực hiện, điều này không giống nhau. – lurker

Trả lời

1

Có, điều đó là bình thường. Thực hiện tối ưu hóa -Ox dưới dạng hướng dẫn. Trung bình, họ sản xuất tối ưu hóa được quảng cáo, nhưng rất nhiều phụ thuộc vào phong cách trong đó mã được viết, bố trí bộ nhớ, cũng như trình biên dịch riêng của mình. Đôi khi, bạn cần phải thử và thất bại nhiều lần trước khi nhận được mã tối ưu. -O2 thực sự cung cấp tối ưu hóa tốt nhất trong hầu hết các trường hợp.

+0

Cảm ơn! Tôi quản lý để vượt qua chỉ -O0, nơi mã lắp ráp của tôi chạy trong 57 và -O1-3 trong khoảng 33s. Nó tốt không? – Monstermania

+0

Vâng, điều đó tốt và để tối ưu hóa thêm, bạn có thể cần phải dành nhiều thời gian và công sức. Mã C++ thường khó khăn hơn để tối ưu hóa so với mã C. Nếu bạn có thể, bạn có thể thử chơi với tối ưu hóa bộ nhớ bằng cách thay đổi kích thước của chồng và đống. Đôi khi, nó giúp. – VladP

2

Lưu ý rằng GCC có nhiều khácoptimization flags.

Không đảm bảo rằng -O3 cho mã nhanh hơn -O2; một trình biên dịch có thể áp dụng nhiều lần tối ưu hóa hơn, nhưng chúng đều là các chẩn đoán và có thể không thành công (hoặc thậm chí làm chậm một chút mã cụ thể của bạn). Do đó, điều này xảy ra là -O3 cung cấp mã hơi chậm hơn -O2 (trên một số mã mã đầu vào cụ thể) cụ thể.

Bạn có thể thử phiên bản mới hơn của GCC (phiên bản mới nhất trong tháng 11 năm 2017- là GCC 7, GCC 8 sẽ hết hạn sau vài tháng). Bạn cũng có thể thử một số tùy chọn better-march= hoặc -mtune=.

Cuối cùng, với GCC plugin của bạn, bạn có thể thêm tối ưu hóa đường chuyền riêng của bạn, hoặc thay đổi thứ tự (và các thiết lập) của tối ưu hóa ứng dụng đi (có vài trăm tối ưu hóa khác nhau qua trong GCC). Nhưng bạn sẽ cần rất nhiều công việc (có lẽ một hoặc hai năm) để có thể mở rộng GCC.

Bạn có thể điều chỉnh các thông số tối ưu hóa và một số dự án (MILEPOST) thậm chí còn sử dụng các kỹ thuật học máy để cải thiện chúng.

Xem thêm trang trình bày và tài liệu tham khảo trên (cũ) GCC MELT documentation của tôi.

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