среда, 20 мая 2009 г.

Оптимизация в gcc, факты

При обновлении своей системы наткнулся на неприятный момент, сборка любых KDE компонент начала вдруг запарываться с руганью:
checking if UIC has KDE plugins available... no

Я далек от мысли что у всех все плохо в течении двух недель (где то так у меня впервые не собралась kopete), а Gentoo мантайнеры не чешутся. Поэтому стал разбираться откуда растут ноги.

Стандартной рекоммендацией в такой ситуации считается - пересобрать qt и kde, но легче от этого не стало. Первым делом я конечно заподозрил, что возможно нестабильную kde-3.5.10 сломали, снял все маски - жужжит (c). Потом я подумал, что, возможно, мешается qt:4, снес его, благо он был мне нужен только для perforce gui, можно потерпеть чуток, но счастья опять не наступило. Не наступило счастье и после полной пересборки системы, что уже совсем непонятно, уж полная пересборка должна помочь?

Долго гуглил... Не помню уже где, увидел упоминание про оптимизацию и gcc-4.3.2, а у меня вся система собрана на -Os. Решил поставить стандартный -O2, ради эксперимента. И, о чудо, компиляция компонентов kde прошла. На этом можно было бы остановиться, но кроме осознания факта неработоспособности qt3+kde3 собранных gcc-4.3.2 с опцией -Os, я узнал много нового про gcc, чем не могу не поделится.

Многие наверное будут удивлены, но опция -march=core2 не включает оптимизацию с применением sse*, как принято считать, а всего лишь допускает использование соответствующих встроенных функций. Как убедились, да очень просто:
void test()
{
// sse2 builtin
__builtin_ia32_movnti(0, 0);
}

$ gcc -march=pentium -c test.cpp
test.cpp: In function ‘void test()’:
test.cpp:3: ошибка: нет декларации ‘__builtin_ia32_movnti’ в этой области видимости
$ gcc -march=core2 -c test.cpp
$

Но в то же время использование правильной архитектуры вовсе не стимулирует компилятор к оптимизации кода с применением расширений. Как определили это? да очень просто:
$ gcc -march=core2 -Q --help=target
...
-msse [выключено]
-msse2 [выключено]
-msse3 [выключено]
-msse4 [выключено]
...

Для того чтобы эта оптимизация выполнялась - необходимо явно задавать -mssse3 -mmmx или другие, необходимые для вашей архитектуры.

Надо сказать, что конструкция gcc -Q --help=CLASS очень полезна во всех отношениях. Я раньше этого не знал. В качестве CLASS можно подставлять в частности target, optimisers, warnings тем самым анализируя настройки компилятора с используемыми в вашем проекте опциями.

PS: Одного я только не понимаю, как -Os может столь фатально влиять на связь приложения с библиотекой?

6 коммент.:

Vigo комментирует...

Хм, интересную вещь вы нашли. Но ведь в мане сказано, что
core2
Intel Core2 CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3 and SSSE3 instruction set support
Прочтя это можно подумать, что -march=core2 задействует эти инструкции, но нужно книжку до конца читать :), вот я набрел на -mavx...
Попробуйте её, и посмотрите на свой результат :) gcc -mavx -march=core2 -mtune=core2 -Q --help=ta

Андрей Валяев комментирует...

Насколько я понимаю AVX - это совершенно отдельное расширение. Ну не то, чтобы совершенно, просто это очередной шаг в развитии всяких SSE.

И появится он впервые в процессорах, построенных на архитектуре Sandy Bridge примерно в этом году...

То, что gcc поддерживает его с версии 4.4.0 - это конечно хорошо, но я думаю нет смысла включать его на более ранних моделях..

Хотя с другой стороны - gcc сцуко умный, -msse2avx всеравно [выключено], так что проблем быть не должно, но не думаю что это будет как-то отличаться от -msse4.2 Для моего Core2

Vigo комментирует...

Запустив опять -march=core2 --help=ta
заметил вот что!
-mno-sse4 [enabled]
Тобишь, принудительно выключенно. Может быть так и должно?
--
Что-то совсем интересное для меня вы такое раскопали :)

Андрей Валяев комментирует...

gcc -march=core2 -mtune=core2 -msse4.2 -Q --help=target

-mno-sse4 [выключено]
-msse4 [включено]
-msse4.1 [включено]
-msse4.2 [включено]
-msse4a [выключено]

sse* надо включать явно, -march недостаточно.

Vigo комментирует...

ну дак вот, я тут еще почитал bugrepot'ы с gcc там они в связи с какимито проблемами из-за автоматизации включения оптимизации mmx сделали ручное включение mmx,sse. Ссылку сейчас дать не могу, потому что на другом компе осталось, завтра попробую :).
И вот -mno-sse4 [enabled] включен. Ну а то что march не включает это-то понятно :).
У вас нигде нет старых gcc, посмотреть как там с этой автоматизацией, желательно релизов до 2005 года :)

Vigo комментирует...

Если интересно, посмотрите топик, там человек опытные проверки проводил, на эту тему.
http://www.linux.org.ru/forum/development/4957290

оказывается -Q может врать :).