Инструмент для выявления проблем с наложением указателей в C / C ++ - PullRequest
3 голосов
/ 05 января 2010

Существует ли инструмент, который может выполнять анализ псевдонимов в программе и сообщать вам, где gcc / g ++ должен генерировать неоптимальные последовательности команд из-за возможного наложения псевдонимов указателей?

Ответы [ 2 ]

4 голосов
/ 05 января 2010

Я не знаю ничего, что дает «100%» покрытие, но для векторизации кода (который часто мешает алиасинг) используйте опцию -ftree-vectorizer-verbose=n, где n - целое число от 1 до 6. Это выводит некоторую информацию почему цикл не может быть векторизован.

Например, с g ++ 4.1, код

//#define RSTR __restrict__
#define RSTR

void addvec(float* RSTR a, float* b, int n)
{
  for (int i = 0; i < n; i++)
    a[i] = a[i] + b[i];
}

Результаты в

$ g++ -ftree-vectorizer-verbose=1 -ftree-vectorize -O3 -c aliastest.cpp

aliastest.cpp:6: note: vectorized 0 loops in function.

Теперь переключитесь на другое определение RSTR, и вы получите

$ g++ -ftree-vectorizer-verbose=1 -ftree-vectorize -O3 -c aliastest.cpp

aliastest.cpp:6: note: LOOP VECTORIZED.
aliastest.cpp:6: note: vectorized 1 loops in function.

Интересно, что если кто-то переключается на g ++ 4.4, он может векторизовать первый неограничивающий случай путем управления версиями и проверки во время выполнения:

$ g++44 -ftree-vectorizer-verbose=1 -O3 -c aliastest.cpp

aliastest.cpp:6: note: created 1 versioning for alias checks.

aliastest.cpp:6: note: LOOP VECTORIZED.
aliastest.cpp:4: note: vectorized 1 loops in function.

И это сделано для обоих определений RSTR.

1 голос
/ 05 января 2010

В прошлом я отслеживал случаи с наименьшими замедлениями с помощью профилировщика. Некоторые из профилировщиков игровой консоли будут выделять части кода, которые вызывают множество штрафов за загрузку-попадание-хранилище - это может часто происходить, потому что компилятор предполагает, что некоторые указатели имеют псевдонимы, и должен генерировать дополнительные инструкции загрузки , Как только вы узнаете, какая часть кода происходит, вы можете вернуться назад от сборки к источнику, чтобы увидеть, что можно считать псевдонимом, и добавить «restict» по мере необходимости (или другие приемы, чтобы избежать дополнительных нагрузок).

Я не уверен, есть ли какие-либо свободно доступные профилировщики, которые позволят вам войти в этот уровень детализации.

Дополнительным преимуществом этого подхода является то, что вы тратите свое время только на изучение случаев, которые на самом деле замедляют ваш код.

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