Избыточность кода сборки в оптимизированном коде C

Я пытаюсь узнать о векторизации, изучая простой код C, скомпилированный в gcc с оптимизацией -O3.Точнее, насколько хорошо компиляторы векторизуют.Это личное путешествие к возможности проверить производительность gcc -O3 с помощью более сложных вычислений.Я понимаю, что общепринято считать, что компиляторы лучше людей, но я никогда не принимаю такую ​​мудрость как должное.Однако в своем первом простом тесте я обнаружил, что некоторые из вариантов, которые делает gcc, довольно странны и, честно говоря, крайне небрежны с точки зрения оптимизации.Я готов предположить, что компилятор имеет что-то целенаправленное и знает что-то о процессоре (в данном случае Intel i5-2557M), чего я не знаю.Но мне нужно подтверждение от знающих людей.Мой простой тестовый код (сегмент):Результирующий ассемблерный код (сегмент), соответствующий циклу for, выглядит следующим образом:Я понимаю все шаги, и с точки зрения вычислений все это имеет смысл.Однако я не понимаю, что gcc решил включить в итерационный цикл шаг для загрузки xmm1 с xmm0 сразу после того, как xmm0 был загружен с xmm1 .т.е.Одно это заставляет меня усомниться в работоспособности оптимизатора.Очевидно, что дополнительный MOVDQA не нарушает данные, но на первый взгляд это может показаться грубой небрежностью со стороны gcc .Ранее в коде сборки (не показан) xmm0 и xmm2 инициализируются некоторым значением, имеющим значение для векторизации, поэтому очевидно, что в начале цикла код должен пропустить первый MOVDQA.Но почему бы gcc просто не изменить порядок, как показано ниже.Или, что еще лучше, просто инициализируйте xmm1 вместо xmm0 и полностью сбросьте шаг MOVDQA xmm1 , xmm0 !Я готов поверить в то, что центральный процессор достаточно умен, чтобы пропустить избыточный шаг или что-то в этом роде, но как я могу доверять gcc для полной оптимизации сложного кода, если он может правильно понять этот простой код?Или может кто-нибудь дать разумное объяснение, которое дало бы мне поверить, что gcc -O3 - это хорошо?
7 голосов | спросил codechimp 25 FebruaryEurope/MoscowbWed, 25 Feb 2015 00:39:19 +0300000000amWed, 25 Feb 2015 00:39:19 +030015 2015, 00:39:19

0 ответов


Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132