Флаги Оптимизации с g ++ - PullRequest
       10

Флаги Оптимизации с g ++

1 голос
/ 26 августа 2010

Я использую g ++ для компиляции кода C ++;программное обеспечение для научного моделирования.

В настоящее время я использую флаги -O3 и -funroll-loops.Я мог заметить большую разницу между -O0, -O1, -O2 и -O3, и почти нет разницы с -funroll-loops.

Не могли бы вы дать какие-либо предложения, чтобы помочь мне увеличитьОптимизация или уловки, которые я могу использовать, чтобы получить еще лучшие результаты?

Спасибо!

Редактировать, как предложено в комментариях: я спрашиваю здесь об «чистой» оптимизации компиляции, т.е.Есть ли что-то умное, чем просто -O3.Интенсивная вычислительная часть кода имеет дело с манипулированием blitz::array в огромных циклах.

Edit2: я действительно имею дело с большим количеством fp (double) math

Ответы [ 3 ]

4 голосов
/ 29 августа 2010

Не видя код, мы можем дать вам только общие советы, которые относятся к широкому кругу проблем.

  1. Попробуйте оптимизацию GCC по профилю.Скомпилируйте инструментированный код с помощью -fprofile-generate, выполните несколько тестовых прогонов с реалистичной рабочей нагрузкой, а затем используйте выходные данные тестового прогона при создании окончательного двоичного файла (-fprofile-use).Тогда GCC сможет лучше угадать, какие ветви используются, и оптимизировать код лучше.
  2. Попробуйте распараллелить ваш код, если сможете.Вы упомянули, что у вас есть циклы над большими элементами данных, это может сработать, если ваши рабочие элементы независимы, и вы можете разделить их.Напримериметь рабочую очередь с пулом рабочих потоков с размером, равным числу процессоров, и отправлять работу в очередь вместо последовательной обработки, тогда потоки пула будут извлекать рабочие элементы из очереди и обрабатывать их параллельно.
  3. Посмотрите на размер блоков данных, с которыми работает ваш код, и попытайтесь разместить их в одной строке кэша L1 (обычно 64 байта).Например, если у вас есть 66-байтовые элементы данных, а размер строки кэша составляет 64 байта, возможно, стоит упаковать структуру или иным образом сжать ее, чтобы она уместилась в 64 байта.
2 голосов
/ 31 августа 2010

Мне не хватает mojo, чтобы комментировать или редактировать ответ Алекса Б., поэтому я отвечу вместо этого.

После того, как вы включите профилирование и запустите свое приложение по ответу Алекса Б., посмотрите на информацию профиля.искать горячие точки, где ваше приложение проводит большую часть своего времени.Если вы обнаружите какой-либо код, взгляните на код и посмотрите, что вы можете сделать, чтобы он стал менее горячим.

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

2 голосов
/ 29 августа 2010

Трудно сказать, не зная кода, который вы хотите ускорить.Кроме того, знание кода может позволить нам улучшить его, сделать его быстрее.

В качестве общего совета попробуйте указать параметр -march, чтобы сообщить GCC, какую модель процессора вы выбираете.Вы можете попробовать -fomit-frame-pointer, если вы делаете много вызовов функций (особенно рекурсивных).Если вы используете сложную математику с плавающей запятой и держитесь подальше от угловых случаев (например, NaN, исключения FP), вы можете попробовать -ffast-math.Последний может принести вам огромное ускорение, но в некоторых случаях это может привести к неправильным результатам.Проанализируйте свой код, чтобы убедиться, что он безопасен.

...