Прежде чем кто-нибудь скажет мне посмотреть старые ответы или RTFM, пожалуйста, обратите внимание, что я уже сделал это, поэтому, пожалуйста, прочитайте детали, прежде чем направлять меня искать в другом месте.
Я установил, что Разница в уровнях оптимизации не так проста, как некоторые различные типы флагов оптимизации, которые были включены для более высокого уровня оптимизации.
Например, я впервые обнаружил разницу в флагах оптимизации O0 и O1, выполнив следующие действия :
gcc -c -Q -O1 --help=optimizers > /tmp/O1-opts
gcc -c -Q -O0 --help=optimizers > /tmp/O0-opts
diff /tmp/O0-opts /tmp/O1-opts | grep enabled
Это дало мне список различных флагов оптимизации, включенных O1 над O0.
Затем я скомпилировал код с -O0, но добавил все отдельные флаги оптимизации, включенные O1 более 0, потому что результат должен быть таким же, как O1, верно? Ну, угадайте что, это не так!
Итак, это доказывает, что разница между уровнями оптимизации заключается не просто в разных типах используемых флагов оптимизации. Я имею в виду, что помимо оптимизационных флагов, которые отображает gcc / g ++, должно быть больше различий в оптимизации.
Пожалуйста, дайте мне знать, если кто-то уже знает ответ на этот вопрос, или мне придется поискать исходный код g cc, который не будет для меня тривиальным. Спасибо!
Что касается причины, по которой я ищу эту информацию, у меня есть код AVX-512, в котором кэш L1D менее 3% пропускает с O0 или без флага оптимизации, но больше, чем 37% (хотя это ускоряет код) с O1 и выше. Если бы я мог понять, какой (скрытый) флаг вызывает это, я мог бы ускорить код еще дальше. В исходном коде g cc слишком много флагов в файле common.opt, поэтому я столкнулся со стеной.