Какой-нибудь макрос или техника для оптимизации деталей? - PullRequest
0 голосов
/ 22 ноября 2008

Я работаю над свободной структурой с помощью компилятора g ++. Похоже, что с ключом -o1 g ++ изменит порядок выполнения моего кода. Как я могу запретить оптимизацию g ++ для определенной части моего кода, в то же время поддерживая оптимизацию для другой части? Я знаю, что могу разделить его на два файла и связать их, но это выглядит ужасно.

Ответы [ 2 ]

3 голосов
/ 22 ноября 2008

Если вы обнаружите, что gcc меняет порядок выполнения в вашем коде, вам следует рассмотреть возможность использования барьера памяти. Только не думайте, что переменные переменные защитят вас от этой проблемы. Они будут следить только за тем, чтобы в одном потоке поведение гарантировалось языком, и всегда будут считывать переменные из своей памяти, чтобы учесть изменения, «невидимые» для исполняемого кода. (например, изменения в переменной, сделанные обработчиком сигнала).

GCC поддерживает OpenMP начиная с версии 4.2. Вы можете использовать его для создания барьера памяти со специальной директивой #pragma.

Очень хорошее представление о блокировке свободного кода дает PDF-файл от Херба Саттера и Андрея Александреску: C ++ и опасности двойной проверки блокировки

3 голосов
/ 22 ноября 2008

Вы можете использовать атрибут функции "__attribute__ ((optimize 0))", чтобы установить оптимизацию для одной функции, или "#pragma GCC optimize" для блока кода. Это только для GCC 4.4, хотя, я думаю - проверьте ваше руководство по GCC. Если они не поддерживаются, разделение источника - ваш единственный выбор.

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

...