Як використовувати оптимізовані керовані профілем в g ++?


75

Крім того, хтось може вказати мені на хороший підручник з цього питання? Я не можу знайти жодного.


12
Чому це голосування проти і проголосували за закриття? Це цілком слушне запитання.
Ніко

9
@jalf це цілком слушне запитання про те, як використовувати оптимізацію, керовану профілем
Laurynas Biveinis

1
@jalf: Я зміню "В чому користь ..." на "Як використовувати ...". Чи задовольнить вас це. Хоча я знаю, що більшість людей розуміють, що я запитую у цьому питанні.
накія

1
@nakiya: якщо ви хочете знати, як зробити оптимізовану за профілем оптимізацію в G ++, то запитайте це. Коли ви запитуєте, як це, я повинен задатися питанням, чи це конкретні комутатори, які вас цікавлять, чи загальна мета "використання оптимізованої за профілем оптимізації для пришвидшення моєї програми".
jalf

1
@jalf: "Оптимізація за профілем:" Цю фразу я вперше почула навіть. Зараз я двічі редагував питання.
Редагую

Відповіді:


58

-fprofile-generirati додаток додатком з кодом профілювання. Під час фактичного запуску програма реєструватиме певні події, які можуть покращити продуктивність, якби цей шаблон використання був відомий під час компіляції. Гілки, можливість вбудовування тощо можна реєструвати, але я не впевнений у деталях, як GCC це реалізує.

Після виходу програми вона скидає всі ці дані у файли * .gcda, які по суті є даними журналу для тестового запуску. Після відновлення програми з прапором -fprofile-use, GCC враховуватиме дані журналу * .gcda під час її оптимізації, зазвичай значно підвищуючи продуктивність. Звичайно, це залежить від багатьох факторів.


5
До речі, якщо ваша програма багатопотокова, то створені дані профілю, ймовірно, будуть несумісними, і ви, ймовірно, отримаєте помилки при спробі її використовувати. Отже, вам, мабуть, потрібно також пройти -fprofile-correctionдруге виклик GCC.
Ніку Стіурка

Я не можу позбутися помилки. Команда, яку я використовую, gcc hello_world.c -o demo_fdo -fprofile-use -freorder-blocks-and-partition -O3 -fprofile-correction -Wcoverage-mismatchвсе ще отримує помилку невідповідності покриття. Що я роблю не так?
gbriones.gdl

23

З цього прикладу :

g++ -O3 -fprofile-generate [more params here, like -march=native ...] -o executable_name
// run my program's benchmarks, or something to stress its most common path
g++ -O3 -fprofile-use [more params here, like -march=native...] -o executable_name

По суті, ви спочатку компілюєте та пов'язуєте цей додатковий прапор як для компіляції, так і для зв'язування: -fprofile-generate звідси ).

Потім, коли ви запускаєте його, за замовчуванням він створює .gcda-файли "поруч" з вашими .o-файлами, здається (жорстко закодований до повного шляху, де вони були побудовані).

При бажанні ви можете змінити , де вона створює ці .gcda файли з -fprofile-каталог = XXX настройки .

Потім ви повторно скомпілюєте та повторно зв’язали, використовуючи -fprofile-useпараметр, а він компілює його, використовуючи керованість профілем.


3
До речі, якщо ваша програма багатопотокова, то створені дані профілю, ймовірно, будуть несумісними, і ви, ймовірно, отримаєте помилки при спробі її використовувати. Отже, вам, мабуть, потрібно також пройти -fprofile-correctionдруге виклик g ++.
Ніку Стіурка

1
Я не можу позбутися помилки. Команда, яку я використовую, gcc hello_world.c -o demo_fdo -fprofile-use -freorder-blocks-and-partition -O3 -fprofile-correction -Wcoverage-mismatchвсе ще отримує помилку невідповідності покриття. Що я роблю не так?
gbriones.gdl

3

Хитрий біт налаштовує make-файли.

Вам обов’язково потрібні окремі вихідні каталоги для об’єктних файлів. Я б порекомендував назвати їх "профіль" та "звільнити". Можливо, вам доведеться скопіювати файли * .gcda, які є результатом запуску профілю, щоб GCC знайшов їх на етапі побудови випуску.

Результат майже напевно буде швидшим. Ймовірно, він буде і більшим. Параметр -fprofile-use дозволяє використовувати багато інших кроків оптимізації, які в іншому випадку увімкнені лише за допомогою -O3.


Чи можете ви прокоментувати, які це кроки оптимізації? Або цитувати якийсь документ?
JohnTortugo

2
@JohnTortugo: info gccі шукайте використання профілю. Там сказано: "Увімкнено такі опції: -fbranch-ймовірності ',' -fvpt ',' -funroll-петлі ',' -fpeel-петлі ',' -ftracer '"
Zan Lynx
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.