Это связано с Determine cause of segfault when using -O3? В вопросе, я улавливаю segfault в определенной функции при компиляции с -O3
с использованием конкретной версии GCC. В -O3
используются инструкции векторизации (в -O2
, они не используются).Как изменить уровень оптимизации одной функции?
Я хочу обернуть одну функцию на более низком уровне оптимизации. Согласно Switching off optimization for a specific function in GCC 4.2.2, я могу это сделать. Однако, следуя различным ссылкам в вопросе и ответах, я не нахожу ответа для «как именно это сделать».
Как пометить одну функцию для использования другого уровня оптимизации?
Связанные, я не хочу, чтобы переместить эту функцию в отдельный файл, а затем предоставить другой рецепт Makefile для него. Это открывает еще одну возможность червей, например, применять ее к GCC 4.9 только на некоторых платформах.
Просто создайте резервную копию, что вы * действительно * не хотите использовать опцию отдельного файла, как если бы вы скомпилировали разные блоки с разными параметрами, которые вы спустили с гурулера. –
Звучит как [XY-проблема] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) для меня. Если ваш код пропускает с оптимизацией, он, скорее всего, обнаруживает _undefined behaviour_. Если это не отображается без оптимизации, это на самом деле плохой знак. Вместо того, чтобы пытаться возиться с оптимизацией, вы обязательно должны искать причину. Если вы не сможете доказать, что это связано с ошибкой в компиляторе, конечно. В этом случае возникает вопрос, как вы гарантируете, что эта ошибка не появится в другом месте. Здесь, используя исправленный или новый компилятор, правильный путь. – Olaf
@Olaf - проблема появляется на '-O3', но нет на' -O2'. В '-O3', GCC использует инструкции SSE. Лучшее, что я могу сказать, 'vmovdqa' требует 128-битных выровненных слов, но код не гарантирует этого. Код гарантирует, что массив будет выровнен по 64 битам, когда используется этот конкретный путь кода. Код также чист с помощью Clang и дезинфицирующего средства Undefined Behavior.Я думаю, что я работаю над ошибкой компилятора. – jww