LINUX.ORG.RU

Link Time Optimization

 , , ,


0

2

С недавнего времени LTO впихивают везде, где можно. Решил однажды потестить эту новомодную приблуду. Понял, что при сборке компилятор стал жрат озу как не в себя. Других изменений не особо заметил.

Решил разузнать поподробнее, что такое LTO, что дает и почему нужно/ненужно. Изучение материала в интернетах только нагнало туману. Пишут кто что.

В данный момент систему собираю шлангом и в нем доступна как полная оптимизация (full-lto), так и частичная (thin-lto). Собираю пакеты без вот этого всего, но все-таки интересно, будет ли профит от сборки с lto.

Что скажут местные погромисты? Стоит ли овчинка выделки или нет? Нужна ли эта оптимизация на самом деле или просто очередной маркетинговый ход?

П.С, я не погромист и очень далёк от высоких материй, поэтому хотелось бы выслушать мнение компетентных людей.

★★★★★

LTO это аналог ситуации, когда ты все исходники слил в один файл и компилируешь только его, тем самым дав компилятору возможность, например, заинлайнить функцию из другого .c-файла. Память жрёт потому что компилирует весь проект целиком а не помодульно. В .o файлах не объектный код а что-то типа предразобранного синтаксического дерева + ещё какие-то лёгкие преобразования.

Поскольку оптимизации вообще могут ломать код, эта оптимизация тоже может что-то сломать. Например: A.c

void my_zero(void * p, size_t n) { bzero(p,n); }

B.c

void some_func() {
  char password[100];
  // ....
  my_zero(password, 100);
}

Если без LTO компилятор, компилирующий B.c, не знает о том, что скрывается внутри my_zero и не может его выкинуть, то с LTO он теперь знает, видит что там не влияющий на логику функционал и может выкинуть этот вызов, повредив безопасности кода.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Меня больше интересует не внутренняя кухня, это слишком сложно, а бинари на выходе. Пишут, что и размер больше и тупить может сильнее. А может и не тупить, как повезет. Отсюда и непонятки, хорошо это или плохо. И что я получу в итоге.

utanho ★★★★★
() автор топика
Последнее исправление: utanho (всего исправлений: 1)
Ответ на: комментарий от utanho

Суть в том что ты разрешаешь компилятору при оптимизациях видеть не только тот файл, который он сейчас компилирует (+ #include из него), а и все остальные, что линкуются при сборке бинарника. Теоретически это должно положительно повлиять на количество оптимизаций, которые может сделать компилятор. Так что думаю скорость работы бинарника должна в среднем вырасти, а размер - как повезёт, сейчас оптимизации на размер обычно не нацелены.

firkax ★★★★★
()
Ответ на: комментарий от utanho

Тебе решать, я ж не знаю чего ты хочешь. У тебя компиляция падает из-за нехватки памяти? Тогда у тебя четыре варианта:

1) забить и компилировать без LTO

2) купить больше памяти

3) сделать больше свапа

4) настроить zram вместо обычного свапа

У каждого из вариантов свои плюсы и минусы, выбирать тебе.

firkax ★★★★★
()
Ответ на: комментарий от firkax

У тебя компиляция падает из-за нехватки памяти?

Нет, не падает. Хотя всего 8Гб на борту. Я вообще монтировал /var/tmp/portage в озу и собирал прям там. Памяти на хватало только для спидерманки, либры и панды. Когда пробовал собирать с лто, время сборки жирных пакетов ощутимо увеличилось .

1) Пока так и делаю.

2) Планирую хотя бы 16Гб, Если вдруг появятся свободные деньги :-)

3) Свап есть и его хватает. Большую часть времени он вообще пустой.

4) Со зрамом я уже наигрался, толку от него нет.

я ж не знаю чего ты хочешь.

Хочу понять, что я получу, кроме увеличенного потребления памяти и времени компиляции.

utanho ★★★★★
() автор топика
Последнее исправление: utanho (всего исправлений: 1)
Ответ на: комментарий от utanho

Если свап пустой, сборка целиком в tmpfs и оно не падает от нехватки памяти - то добавление памяти ничем не поможет. Время сборки больше потому, что компилятору надо просматривать больше данных для проведения оптимизаций.

Хочу понять, что я получу, кроме увеличенного потребления памяти и времени компиляции.

Общее правило: больше потратился на компиляцию - быстрее работает скомпилированное. Я (на десктопе) предпочитаю вообще не тратиться и пользуюсь бинарным дистром.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

Общее правило: больше потратился на компиляцию - быстрее работает скомпилированное

В каких попугаях можно измерить это ускорение?

Я (на десктопе) предпочитаю вообще не тратиться и пользуюсь бинарным дистром.

Я так-то не против. Но однажды я понял, что пакеты собирают тоже люди со своими тараканами. И если в генте я еще как-то могу поправить ебилд, то в бинарных дистрах надо жрат чодали.

utanho ★★★★★
() автор топика
Последнее исправление: utanho (всего исправлений: 1)

Долгое время собирал файрфокс с lto и pgo, когда он в генте разучился в pgo даже свой ебилд с патчами в оверлее держал. А потом осознал что органолептически я разницы в работе вообще не ощущаю, только в тестах. А собирается значительно дольше. Перестал париться на эту тему и теперь собираю без всего этого. IMHO если у тебя шустрый комп у тебя и так всё шустро. А если нет, так ты и собирать со всем этим умучаешься. ЕМНИП сама Мозилла firefox-bin собирает с lto и pgo, так что если комп слабый разумнее firefox-bin поставить например.

Я понимаю что ты про всю систему спрашиваешь, но я думаю всё аналогично моему опыту с firefox.

Jameson ★★★★★
()
Последнее исправление: Jameson (всего исправлений: 1)
Ответ на: комментарий от utanho

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

Jameson ★★★★★
()
Последнее исправление: Jameson (всего исправлений: 1)
Ответ на: комментарий от Jameson

почувствуешь ускорение от lto

Вот и я не уверен. Поэтому и спрашиваю. В интернетах в основном вода и теоретизирование.

Есть какой-нибудь тест, чтобы оценить было/стало?

utanho ★★★★★
() автор топика
Последнее исправление: utanho (всего исправлений: 1)
Ответ на: комментарий от utanho

Для фокса есть тесты на быстродействие рендеринга и т.п., сотни их. Там с lto и с lto + pgo попугаи отличались. А при реальной эксплуатации я так и не понял в чём разница, и так всё моментально рисуется, видео как игралось так и играется, всякие 3d игры в браузере как упирались в итоге в видеокарту так и упираются...

Jameson ★★★★★
()
Ответ на: комментарий от utanho

вода и теоретизирование

Думаю поэтому и вода, что никто не понимает что именно там радикально ускориться должно и главное зачем, если всё и так быстро работает и упирается в восприятие юзера, а не в камень или софт.

Jameson ★★★★★
()
Ответ на: комментарий от Jameson

Я совсем запутался. Так стоит или не стоит? В принципе и так все устраивает. И я сильно сомневаюсь, что игори шустрее будут играть. 4к я не смотрю (экран 1366х768).

utanho ★★★★★
() автор топика
Ответ на: комментарий от utanho

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

Jameson ★★★★★
()

погромисты

Сразу лесом!

dataman ★★★★
()

Это всё нужно тестировать. Т.е. собрал жирный бинарь, особенно, если он собран со статической линковкой и после тестов уже можно будет сказать - имеет ли это смысл, использовать LTO. Вцелом, чаше да, чем нет, но сборка бывает ОЧЕНЬ долгая! А профит в плане производительности часто незначительный…

menangen ★★★★★
()

inline казалось бы deprecated в современном c++, но нетутто было! От него есть прирост даже с LTO. Засим утверждаю - лто кака.

anonymous
()

На примере Firefox, собирал всю дорогу без lto, pgo, до версии где то 78esr, потом перешёл на бинарный(выходит с lto, pgo), бинарный заработал заметно шустрей, визуально.

spawn_sp ★★★★
()

Собираю ядро с LTO, разницы на глаз не вижу, зато оно меньше по размеру получается.

Если кто планирует ядро с LTO собирать, отрубайте в конфиге опцию CONFIG_DEBUG_INFO, иначе при сборке может выжрать больше 16 GB оперативки, в зависимости от количества модулей, в то время как без этой опции потребление памяти почти в 3 раза меньше.

Kron4ek ★★★★★
()
Последнее исправление: Kron4ek (всего исправлений: 2)
Ответ на: комментарий от anonymous
laptop /usr/src/linux # cat ./.config | grep DEBUG
# CONFIG_CGROUP_DEBUG is not set
# CONFIG_DEBUG_RSEQ is not set
# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
# CONFIG_SLUB_DEBUG is not set
CONFIG_X86_DEBUGCTLMSR=y
# CONFIG_DEBUG_HOTPLUG_CPU0 is not set
# CONFIG_PM_DEBUG is not set
# CONFIG_ACPI_DEBUGGER is not set
# CONFIG_ACPI_EC_DEBUGFS is not set
# CONFIG_ACPI_DEBUG is not set
# CONFIG_SECCOMP_CACHE_DEBUG is not set
CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
# GUP_TEST needs to have DEBUG_FS enabled
# CONFIG_BT_FEATURE_DEBUG is not set
# CONFIG_MAC80211_DEBUG_MENU is not set
# CONFIG_PCI_DEBUG is not set
# CONFIG_DEBUG_DRIVER is not set
# CONFIG_DEBUG_DEVRES is not set
# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set
CONFIG_PNP_DEBUG_MESSAGES=y
# CONFIG_IWLWIFI_DEBUG is not set
# CONFIG_I2C_DEBUG_CORE is not set
# CONFIG_I2C_DEBUG_ALGO is not set
# CONFIG_I2C_DEBUG_BUS is not set
# CONFIG_POWER_SUPPLY_DEBUG is not set
# CONFIG_HWMON_DEBUG_CHIP is not set
# CONFIG_VIDEO_ADV_DEBUG is not set
# CONFIG_DVB_ULE_DEBUG is not set
# CONFIG_DRM_DEBUG_MM is not set
# CONFIG_DRM_DEBUG_SELFTEST is not set
# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set
# CONFIG_DRM_I915_DEBUG_MMIO is not set
# CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS is not set
# CONFIG_DRM_I915_DEBUG_GUC is not set
# CONFIG_DRM_I915_DEBUG_VBLANK_EVADE is not set
# CONFIG_DRM_I915_DEBUG_RUNTIME_PM is not set
# CONFIG_SND_DEBUG is not set
# CONFIG_USB_STORAGE_DEBUG is not set
# CONFIG_MEMSTICK_DEBUG is not set
# CONFIG_RTC_DEBUG is not set
# CONFIG_DMADEVICES_DEBUG is not set
# CONFIG_DMABUF_DEBUG is not set
# CONFIG_EXT4_DEBUG is not set
# CONFIG_JBD2_DEBUG is not set
# CONFIG_QUOTA_DEBUG is not set
# CONFIG_NTFS_DEBUG is not set
# CONFIG_DMA_API_DEBUG is not set
# CONFIG_DYNAMIC_DEBUG is not set
# CONFIG_DYNAMIC_DEBUG_CORE is not set
CONFIG_DEBUG_BUGVERBOSE=y
# CONFIG_DEBUG_SECTION_MISMATCH is not set
# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
# CONFIG_DEBUG_FS is not set
CONFIG_DEBUG_KERNEL=y
# CONFIG_DEBUG_MISC is not set
# CONFIG_DEBUG_PAGEALLOC is not set
# CONFIG_DEBUG_RODATA_TEST is not set
CONFIG_ARCH_HAS_DEBUG_WX=y
# CONFIG_DEBUG_WX is not set
# CONFIG_DEBUG_OBJECTS is not set
CONFIG_HAVE_DEBUG_KMEMLEAK=y
# CONFIG_DEBUG_KMEMLEAK is not set
# CONFIG_DEBUG_STACK_USAGE is not set
CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y
# CONFIG_DEBUG_VM is not set
# CONFIG_DEBUG_VM_PGTABLE is not set
CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y
# CONFIG_DEBUG_VIRTUAL is not set
# CONFIG_DEBUG_MEMORY_INIT is not set
# CONFIG_DEBUG_PER_CPU_MAPS is not set
# CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set
# CONFIG_DEBUG_SHIRQ is not set
# CONFIG_SCHED_DEBUG is not set
# CONFIG_DEBUG_TIMEKEEPING is not set
# CONFIG_DEBUG_PREEMPT is not set
CONFIG_LOCK_DEBUGGING_SUPPORT=y
# CONFIG_DEBUG_RT_MUTEXES is not set
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_MUTEXES is not set
# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set
# CONFIG_DEBUG_RWSEMS is not set
# CONFIG_DEBUG_LOCK_ALLOC is not set
# CONFIG_DEBUG_ATOMIC_SLEEP is not set
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
# CONFIG_CSD_LOCK_WAIT_DEBUG is not set
# CONFIG_DEBUG_IRQFLAGS is not set
# CONFIG_DEBUG_KOBJECT is not set
# CONFIG_DEBUG_LIST is not set
# CONFIG_DEBUG_PLIST is not set
# CONFIG_DEBUG_SG is not set
# CONFIG_DEBUG_NOTIFIERS is not set
# CONFIG_DEBUG_CREDENTIALS is not set
# CONFIG_RCU_EQS_DEBUG is not set
# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set
# CONFIG_DEBUG_TLBFLUSH is not set
# CONFIG_CPA_DEBUG is not set
# CONFIG_DEBUG_ENTRY is not set
# CONFIG_DEBUG_NMI_SELFTEST is not set
# CONFIG_X86_DEBUG_FPU is not set
# CONFIG_PUNIT_ATOM_DEBUG is not set


Те, которые еще включены - просто так не вырубить.

utanho ★★★★★
() автор топика
Ответ на: комментарий от spawn_sp

PGO вообще пушка когда есть какой-то конкретный сценарий использования, а скоро ещё BOLT приедет

Stil ★★★★★
()
Ответ на: комментарий от Stil

BOLT

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

anonymous
()
Ответ на: комментарий от Kron4ek

на глаз не вижу

Классика.

зато оно меньше по размеру получается

Всем насрать на размер при терабайтных дисках и под сотню гигов озу поддерживаемых целероном.

anonymous
()
Ответ на: комментарий от anonymous

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

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 2)
Ответ на: комментарий от hobbit

в моду

Не интересует какие игрушки модны на woman.ru.

anonymous
()
Ответ на: комментарий от spawn_sp

Вопрос без издёвки, а на каком железе разница была ощутима визуально? Потому что я собирал фокс и с этим всем, и без этого всего, и разницу видел только в виде тестовых попугаев. В практическом использовании отличий не видел вообще, на камнях начиная с i3. Сильнее ощущался недостаток ОЗУ, но эту проблему pgo с lto не решает, её решал zswap или zram. Вот когда у меня был недоноут на атоме я разницу между бинарным фоксом от мозиллы с этим всем и скомпилённым локально без этого видел, поэтому интересно на каком железе у тебя ускорение заметно?

Jameson ★★★★★
()
Последнее исправление: Jameson (всего исправлений: 1)
Ответ на: комментарий от anonymous

Админ локалхоста…

Всем насрать на размер при терабайтных дисках и под сотню гигов озу поддерживаемых целероном.

Только вот Alpine Linux прочие, заточенные на минималистичнось дистрибутивы, развиваются вовсю - не подскажешь почему?

Kroz ★★★★★
()

отклик как протестировать?

anonymous
()
Ответ на: комментарий от Kroz

Админ локалхоста

Alpine Linux

Только регистрант может так поделить самого же себя на ноль в следующем же предложениии. Даже добавить нечего.

anonymous
()
Ответ на: комментарий от Jameson

Извини давно не заходил в LOR, железо старое, ноут 2011года с i7-2630QM, интеграшка intel, дискретку не использую, ff тоже не свежий, тормознул обновку на 88версии, отрабатывет нормально пока.

spawn_sp ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.