Điều này liên quan đến Determine cause of segfault when using -O3? Trong câu hỏi, tôi đang bắt một segfault trong một chức năng cụ thể khi biên soạn với -O3
bằng cách sử dụng một phiên bản cụ thể của GCC. Tại -O3
, hướng dẫn vectơ được sử dụng (tại -O2
, chúng không được sử dụng).Làm cách nào để thay đổi mức tối ưu hóa của một chức năng?
Tôi muốn bọc một hàm duy nhất ở mức tối ưu hóa thấp hơn. Theo số Switching off optimization for a specific function in GCC 4.2.2, tôi có thể làm được. Tuy nhiên, theo các liên kết khác nhau trong câu hỏi và câu trả lời, tôi không tìm thấy câu trả lời cho "cách chính xác, để thực hiện".
Làm cách nào để đánh dấu một hàm duy nhất để sử dụng cấp tối ưu hóa khác?
Có liên quan, tôi không muốn di chuyển hàm này sang tệp riêng biệt, sau đó cung cấp công thức makefile khác cho nó. Làm như vậy sẽ mở ra một loại sâu khác, như chỉ áp dụng cho GCC 4.9 trên một số nền tảng.
Chỉ cần sao lưu mà bạn * thực sự * không muốn thực hiện tùy chọn tệp riêng biệt, như thể bạn biên dịch các đơn vị khác nhau với các tùy chọn khác nhau mà bạn đang sử dụng thanh gurguler. –
Nghe như một [XY-problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) với tôi. Nếu mã của bạn không hoạt động với tối ưu hóa, nó rất có khả năng biểu diễn _undefined behaviour_. Nếu điều đó không hiển thị mà không tối ưu hóa thực sự là một dấu hiệu xấu. Thay vì cố gắng để fiddle với tối ưu hóa, bạn dứt khoát nên tìm kiếm nguyên nhân. Trừ khi bạn có thể chứng minh nó là do một lỗi trong trình biên dịch, tất nhiên. Trong trường hợp này, câu hỏi đặt ra cách bạn đảm bảo lỗi này sẽ không hiển thị ở nơi khác. Ở đây, sử dụng một trình biên dịch được vá hoặc mới hơn là cách chính xác. – Olaf
@Olaf - sự cố hiển thị ở '-O3', nhưng không xuất hiện ở' -O2'. Tại '-O3', GCC sử dụng lệnh SSE. Điều tốt nhất tôi có thể nói, 'vmovdqa' yêu cầu các từ được liên kết 128 bit, nhưng mã không đảm bảo nó. Mã này đảm bảo mảng được căn chỉnh 64 bit khi đường dẫn mã cụ thể này được sử dụng. Mã này cũng được làm sạch với Clang và chất khử trùng hành vi không xác định của nó.Tôi nghĩ rằng tôi đang làm việc xung quanh một lỗi trình biên dịch. – jww