Влияние производительности -fno-строгого псевдонима - PullRequest
21 голосов
/ 04 августа 2009

Есть ли какое-либо исследование или набор тестов, показывающих производительность? ухудшение из-за указания -fno-strict-aliasing в GCC эквивалент в других компиляторах)?

Ответы [ 3 ]

23 голосов
/ 06 августа 2009

Это будет сильно отличаться от компилятора к компилятору, так как разные компиляторы реализуют его с разными уровнями агрессии. GCC довольно агрессивен в этом отношении: включение строгого псевдонима заставит его думать, что указатели, которые «явно» эквивалентны человеку (например, foo *a; bar *b = (bar *) a;), не могут создавать псевдонимы, что допускает некоторые очень агрессивные преобразования, но может явно нарушать Тщательно написанный код. По этой причине в Apple GCC по умолчанию отключен строгий псевдоним.

LLVM, напротив, даже не имеет строгого псевдонима , и, хотя это запланировано, разработчики заявили, что планируют реализовать его как запасной вариант, когда ничто другое не может судить об эквивалентности , В приведенном выше примере он все равно будет судить эквивалентные значения a и b. Он будет использовать псевдонимы только на основе типов, если не сможет определить их отношения каким-либо другим способом.

По моему опыту, влияние строгого псевдонима на производительность в основном связано с движением кода, инвариантного к циклу, где информация о типе может быть использована для доказательства того, что внутриконтурные загрузки не могут создавать псевдоним массива, который повторяется, что позволяет вытащил из петли. YMMV.

10 голосов
/ 05 августа 2009

Что я могу вам сказать из своего опыта (проверив это в большом проекте на PS3, PowerPC представляет собой архитектуру, которая благодаря большому количеству регистров может на самом деле извлечь выгоду из SA), так это то, что вы увидите оптимизацию как правило, будет очень локальным (с точки зрения объема) и небольшим. На исполняемом файле размером 20 МБ он удалил, может быть, 80 КБ из секции .text (= код), и все это было в небольших областях и циклах.

Эта опция может сделать ваш сгенерированный код немного более легким и оптимизированным, чем сейчас (подумайте в диапазоне от 1 до 5 процентов), но не ожидайте каких-либо больших результатов. Следовательно, эффект использования -fno-strict-aliasing, вероятно, вообще не будет сильно влиять на вашу производительность. Тем не менее, наличие кода, требующего -fno-strict-aliasing, в лучшем случае является неоптимальной ситуацией.

6 голосов
/ 21 июля 2016

Вот ссылка на исследование, проведенное в 2004 году: http://docs.lib.purdue.edu/cgi/viewcontent.cgi?article=1124&context=ecetr, касающееся, среди прочего, строгого влияния псевдонимов на производительность кода. Рисунок 2.5 показывает относительное улучшение от 3% до 10%.

Объяснение исследователей снижения производительности:

Из проверки кода сборки мы обнаружили, что деградация является следствием алгоритм распределения регистров. В GCC реализован распределитель регистров окраски графа [2, 3]. При строгом наложении диапазоны переменных переменных становятся длиннее, что приводит к высокому давлению в регистре и разливу. При более консервативном псевдониме одни и те же переменные также переносят память в конце своих (более коротких) диапазонов.

[2] Питер Бергнер, Питер Даль, Дэвид Энгебретсен и Мэтью Т. О'Киф. Код разлива минимизация за счет разлива области помех. В SIGPLAN Конференция по программированию Разработка и реализация языка, стр. 287–295, 1997.

[3] Престон Бриггс, Кит Д. Купер и Линда Торчон. Улучшения в раскраске графов Распределение регистров. Транзакции ACM по языкам и системам программирования, 16 (3): 428–455, май 1994 г.

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