Более быстрый код с другим компилятором - PullRequest
3 голосов
/ 03 июня 2010

Я использую стандартный gcc компилятор в разработке математических программ на языке Си. Я не очень много знаю о компиляторах или опциях компилятора, и мне было просто интересно, возможно ли сделать более быстрые исполняемые файлы с использованием другого компилятора или выбрать лучшие варианты? Makefile по умолчанию устанавливает параметры -ffast-math и -O3, и я думаю, что оба они оказывают некоторое влияние на общее время расчета. Мое программное обеспечение использует память довольно широко, поэтому я думаю, что некоторые опции, связанные с управлением памятью, могут помочь?

Есть идеи?

Ответы [ 6 ]

9 голосов
/ 03 июня 2010

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

5 голосов
/ 03 июня 2010

Вот несколько советов о производительности gcc: сделать тесты с -Os, -O2 и -O3. Иногда -O2 будет быстрее, потому что он делает код короче. Поскольку вы сказали, что используете много памяти, попробуйте также использовать -Os и выполнить измерения.

Также проверьте на клиентском компьютере параметр -march = native (его можно использовать безопасно, если вы делаете исполняемый файл для компьютеров с аналогичными процессорами). Иногда это может оказать значительное влияние на производительность. Если вам нужно составить список параметров, которые gcc использует с native, вот как это сделать:
Создайте небольшую C-программу под названием test.c, затем

$ touch test.c
$ gcc -march=native -fverbose-asm -S test.c
$ cat test.s

кредитов для кода пользователей форумов Gentoo. Он должен распечатать список всех оптимизаций, используемых gcc. Обратите внимание, что если вы используете i7, gcc 4.5 определит его как Atom, поэтому вам нужно будет вручную установить -march и -mtune.

Также прочитайте этот документ, он поможет вам (тем не менее, по моему опыту в Gentoo, -march = native работает лучше) http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html

Вы можете попробовать новые опции в поздних 4.4 и ранних версиях 4.5, такие как -flto и -fwhole-program. Это должно помочь с производительностью, но при экспериментировании с ними моя система была нестабильной. В любом случае, прочитайте этот документ тоже, он поможет вам понять некоторые параметры оптимизации GCC http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

3 голосов
/ 03 июня 2010

Если вы работаете в Linux на x86, то компиляторы Intel или PGI обычно обеспечивают значительно более быстрое выполнение исполняемых файлов.

Недостатком является то, что есть больше ручек для настройки, и что они имеют здоровенный ценник!

1 голос
/ 03 июня 2010

Имейте в виду, что большинство улучшений, которые будут достигнуты при изменении компиляторов или настроек, принесут вам только пропорциональное ускорение, тогда как в качестве алгоритмов настройки вы можете иногда получить улучшения O() вашей программы. Не забудьте исчерпать это, прежде чем вы начнете много работать в настройках.

1 голос
/ 03 июня 2010

Поскольку вы говорите, что ваша программа имеет большой объем памяти, вы можете протестировать использование другой реализации malloc, чем в стандартной библиотеке вашей платформы. Например, вы можете попробовать jemalloc (http://www.canonware.com/jemalloc/).

1 голос
/ 03 июня 2010

Если у вас есть конкретное оборудование, на которое вы можете ориентировать свой код, компания (оборудование) часто выпускает платные компиляторы, оптимизированные для этого оборудования.

Например:

Эти компиляторы обычно обеспечивают лучшую оптимизацию кода.

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