Оптимизация кода C с использованием #pragma GCC optimize - PullRequest
3 голосов
/ 17 июля 2011

Я пытаюсь использовать прагму GCC для оптимизации, чтобы установить глобальные оптимизации в моем C-коде. Версия GCC 4.4.3 на Ubuntu. Основная идея состоит в том, чтобы использовать специфичные для функции уровни оптимизации.

#pragma GCC optimize ("O3")

Я получаю ошибку компиляции как раз перед моей основной функцией в моем коде C

Но при сборке я получаю ошибку компиляции, как показано ниже -

passrecovery.c: In function âmainâ:
passrecovery.c:493: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-4.4/README.Bugs> for instructions.
make: *** [all] Error 1

Я проверил файл README.Bugs, упомянутый в сообщении об ошибке, но не нашел никаких подсказок по этому поводу.

Поддерживается ли #pragma optimize в 4.4.3 GCC или нет?

Если да, то что я неправильно делаю, используя эту прагму для оптимизации кода.

Любая другая альтернативная директива GCC для оптимизации кода для скорости?

РЕДАКТИРОВАТЬ : я даже попытался #pragma GCC push_options, затем #pragma GCC optimize ("O3") и в конце файла #pragma GCC pop_options; та же ошибка.

Ответы [ 2 ]

8 голосов
/ 17 июля 2011

ICE (внутренняя ошибка компилятора), приводящая к ошибке сегментации, всегда является ошибкой в ​​компиляторе, поэтому он просит вас сообщить об ошибке. Вы не должны иметь возможность сбить компилятор с любым исходным кодом, действительным или недействительным. (Возможны всевозможные вещи, чаще всего связанные с отказом компилировать неверный код, но сбой не входит в их число.)

Поскольку GCC 4.6.1 является текущей, почему бы не рассмотреть возможность обновления до более новой версии GCC (не то, что 4.4.3 - это все, что старое).

Перед отправкой отчета об ошибке вы должны попытаться свести к минимуму ваше воспроизведение. Все, начиная со строки 494, вероятно, несущественно; если повезет, вы можете уменьшить материал между строками 1 и 493 с почти 500 до 20 или около того. Вам, безусловно, следует стремиться максимально уменьшить его, сохранив при этом ошибку. Перед тем, как начать нарезку кода, сохраните версию, которая приводит к сбою компилятора. После успешного удаления кода при сохранении сбоя проверьте каждую последующую версию в своей VCS. (Вы используете VCS, не так ли? Это риторический вопрос; если нет, сейчас хорошее время для начала. Вам нужен один, чтобы избежать внесения изменений, которые нельзя отменить. ) Попробуйте удалить нестандартные заголовки (те, которые вы написали), прежде чем удалять стандартные заголовки. Постарайтесь избавиться от как можно большего количества заголовков. Обратите внимание на запрос предварительно обработанного источника - сокращение кода, о котором я говорю, уменьшает размер предварительно обработанного источника.

4 голосов
/ 17 июля 2011

Последний вопрос: вы можете поместить его в отдельный модуль компиляции и использовать переключатель командной строки: -O3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...