Анализ использования ассемблерных вставок в коде открытых проектов
2 апреля 2013 года
Стив Макинтаир (Steve McIntyre), несколько лет занимавший пост лидера проекта Debian, опубликовал результаты исследования (Архивная копия от 10 июня 2016 на Wayback Machine) интенсивности использования ассемблерного кода в открытых проектах. Исследование проведено инженерной группой консорциума Linaro, занимающегося адаптацией и оптимизацией открытых проектов и Linux для платформы ARM, совместно с разработчиками дистрибутивов Ubuntu и Fedora.
Исследование нацелено на выявление областей, требующих доработки в процессе внедрения новой 64-разрядной архитектуры ARMv8 (AArch64) и серверных систем на базе архитектуры ARMv7. Наличие специфичных для различных архитектур ассемблерных вставок является одним из признаков необходимости портирования кода для использования на новой архитектуре или проведения дополнительных оптимизаций. В итоге, после изучения кода всех пакетов в репозиториях Ubuntu и Fedora, был сформирован список(недоступная ссылка) из 1435 пакетов, включающих ассемблерные вставки и проведён анализ где и для чего они используются и действительно ли подобные вставки необходимы.
Основные выводы:
- Подавляющее большинство приложений в репозиториях не требуют отдельного портирования. Например, из более 20 тысяч src-пакетов в репозитории Ubuntu 13.04 только около 1200 (6%) содержат ассемблерные вставки.
- Большинство пакетов с ассемблерными вставками будут работать на других архитектурах без дополнительного портирования так как ассемблерный код используется только для оптимизации и предусматривает наличие замены на C/C++ или связан с реализацией дополнительных возможностей, что не блокирует сборку приложения на новых архитектурах.
- Большая часть ассемблерных вставок малозначительна и не создаёт должного увеличения производительности. Часто разработчики пытаются использовать тривиальный код с надеждой увеличить скорость выполнения тех или иных действий, но при этом общий эффект подавляется другими узкими местами.
- Наименее приоритетными категориями портирования называются игры и десктоп-приложения. В первую очередь планируется портировать системные компоненты, библиотеки и базовые инструменты. Среди пакетов, требующих портирования, отмечаются: ядро, gcc, (e)glibc, klibc, libffi, binutils, gdb, device-tree-compiler, libunwind, openjdk, mpfr, llvm, gmp. Будут работать, но требуют реализации дополнительных оптимизаций grub2, TBB, openssl, libatomic-ops, libgcrypt, php, postgres, mysql, libaio. Кроме того, в первоочерёдный список портирования попали zlib, libgc, libjpeg, dlmalloc, nss и gnulib.
- В списке основных проблем упоминается необдуманное копирование оптимизаций из одного приложения в другое, во многих пакетах они применены не к месту и не приводят к ожидаемому разработчиками эффекту. Часто подобным образом расползается по проектам код, содержащий ошибки. Другой проблемой является встраивание библиотек в программу, вместо их использования в качестве зависимости. Некоторые ассемблерные вставки нельзя трактовать иначе, как код, забытый десятилетия назад. Например, был обнаружен код для систем VAX, образца 1970-х годов. Также во многих местах ассемблерный код присутствует в коде, но не используется.
Выявленные ассемблерные компоненты были разделены на следующие категории (проценты указаны относительно числа пакетов с ассемблерными вставками):
- 38.1% пакетов используют ассемблерный код для выполнения различных низкоуровневых операций, таких как прямое взаимодействие с оборудованием и определение типа аппаратного обеспечения. Многие программы используют инструкции CPUID для идентификации CPU, при этом данные чаще всего используются лишь для статистики/диагностики и напрямую не связаны с работой приложения. Популярно также использование инструкций RDTSC для взаимодействия с таймером в программах для тестирования производительности.
- 30.4% пакетов используют ассемблерные вставки для оптимизации производительности, например, для ускорения мультимедийных операций применяются инструкции SIMD (MMX/SSE/SSE2). Многие из ассемблерных оптимизаций типовые и скопированы из других пакетов не разбираясь особо как именно работает код.
- 18.1% пакетов связны со встраиванием в состав кода различных типовых библиотек, содержащих ассемблерные вставки, например, чаще всего встраиваются libjpeg, gettext, gnulib, libgc, sqlite и zlib.
- 11.1% пакетов попали в список по ошибке, например, файлы с расширением ".s" были приняты за код на ассемблере или программы содержат ассемблерный код в форме данных, в комментариях или в документации.
- В 10% пакетов ассемблерный код используется для реализации различных атомарных примитивов, таких как блокировки и операции инкремента/декремента.
- 9.3% пакетов включают ассемблерный код, необходимый для обеспечения работы на других операционных системах или сторонних платформах, т.е. в Linux такой код не используется.
- В 2.9% пакетов ассемблерные вставки используются для прямого управления содержимым служебных областей исполняемых файлов или библиотек.
Источники
править
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.