В компьютерном программном обеспечении , в теории компиляторов, внутренняя функция (или встроенная функция ) - это функция ( подпрограмма ), доступная для использования на данном языке программирования , реализация которой специально обрабатывается компилятором . Как правило, он может заменить последовательность автоматически сгенерированных инструкций для исходного вызова функции, аналогично встроенной функции . [1] В отличие от встроенной функции, компилятор хорошо знает внутреннюю функцию и, таким образом, может лучше интегрировать и оптимизировать ее для данной ситуации.
Компиляторы, реализующие встроенные функции, обычно включают их только тогда, когда программа запрашивает оптимизацию , в противном случае они возвращаются к реализации по умолчанию, предоставляемой системой языковой среды (средой).
Внутренние функции часто используются для явной реализации векторизации и распараллеливания на языках, которые не обращаются к таким конструкциям. Некоторые интерфейсы прикладного программирования (API), например AltiVec и OpenMP , используют встроенные функции для объявления, соответственно, векторизуемых и многопроцессорных операций во время компиляции. Компилятор анализирует внутренние функции и преобразует их в векторный математический или многопроцессорный объектный код, подходящий для целевой платформы . Некоторые встроенные функции используются для предоставления оптимизатору дополнительных ограничений, таких как значения, которые переменная не может принимать. [2]
C и C ++
Компиляторы для C и C ++ от Microsoft, [3] Intel, [1] и GNU Compiler Collection (GCC) [4] реализуют встроенные функции, которые отображаются непосредственно на одну инструкцию x86, инструкции с несколькими данными ( SIMD ) ( MMX , Streaming SIMD) Расширения (SSE), SSE2 , SSE3 , SSSE3 , SSE4 , AVX , AVX2 , AVX512 , FMA , ...). Visual C ++ Microsoft составитель Microsoft Visual Studio не поддерживает встроенные сборки для x86-64 . [5] [6] [7] [8] Чтобы компенсировать это, были добавлены новые встроенные функции, которые отображают стандартные инструкции сборки, которые обычно не доступны через C / C ++, например, сканирование битов.
Некоторые компиляторы C и C ++ предоставляют непереносимые встроенные функции, специфичные для платформы. Другие встроенные функции (такие как встроенные модули GNU ) немного более абстрактны, приближаясь к возможностям нескольких современных платформ, с переносными реализациями отката на платформах без соответствующих инструкций. [9] Это является общим для библиотек C ++, такие как GLM или Sony «s вектора математических библиотеки , [10] для достижения переносимости через условную компиляцию (на основе флагов конкретной платформы составителя), обеспечивая полностью портативные примитивы высокого уровня (например, четырехэлементный векторный тип с плавающей запятой), отображаемый на соответствующие реализации низкоуровневого языка программирования , при этом все еще пользуясь преимуществами системы типов C ++ и встраивания; отсюда преимущество перед связыванием с рукописными объектными файлами сборки с использованием двоичного интерфейса приложения C (ABI).
Примеры
uint64_t __rdtsc (); // возврат внутреннего счетчика тактовой частоты процессора uint64_t __popcnt64 ( uint64_t n ); // количество битов, установленных в n uint64_t _umul128 ( uint64_t Factor1 , uint64_t Factor2 , uint64_t * HighProduct ); // 64 бит * 64 бит => 128-битное умножение __m512 _mm512_add_ps ( __m512 a , __m512 b ); // вычисляет a + b для двух векторов из 16 чисел с плавающей запятой __m512 _mm512_fmadd_ps ( __m512 a , __m512 b , __m512 c ); // вычисляет a * b + c для трех векторов из 16 чисел с плавающей запятой
- Ссылки
- Intel Intrinsics
Ява
HotSpot виртуальной машины Java «s (JVM) только по времени компилятор также имеет встроенные функции для конкретного Java API. [11] Внутренние функции Hotspot - это стандартные API-интерфейсы Java, которые могут иметь одну или несколько оптимизированных реализаций на некоторых платформах.
Рекомендации
- ^ a b «Руководство и справочник разработчика Intel® C ++ Compiler 19.1» . Документация по компилятору Intel® C ++ . 16 декабря 2019 . Проверено 17 января 2020 .
- ^ Команда Clang (2020). «Расширения языка Clang» . Документация Clang 11 . Проверено 17 января 2020 .
Встроенные функции
- ^ MSDN . «Внутренние функции компилятора» . Microsoft . Проверено 20 июня 2012 .
- ^ Документация GCC. «Встроенные функции, специфичные для конкретных целевых машин» . Фонд свободного программного обеспечения . Проверено 20 июня 2012 .
- ^ MSDN . «Внутренняя и встроенная сборка» . Microsoft . Архивировано из оригинала на 2018-01-02 . Проверено 16 апреля 2010 .
- ^ MSDN . «Внутренняя и встроенная сборка» . Microsoft . Проверено 28 сентября 2011 .
- ^ MSDN . «Внутренняя и встроенная сборка» . Microsoft . Проверено 28 сентября 2011 .
- ^ MSDN . «Внутренняя и встроенная сборка» . Microsoft . Проверено 28 сентября 2011 .
- ^ «Векторные расширения» . Использование коллекции компиляторов GNU (GCC) . Проверено 16 января 2020 .
- ^ «Sony открывает исходные коды векторных математических и математических библиотек SIMD (Cell PPU / SPU / другие платформы)» . Форум Beyond3D . Проверено 17 января 2020 .
- ^ Мок, Крис (25 февраля 2013 г.). «Внутренние методы в HotSpot VM» . Slideshare . Проверено 20 декабря 2014 .
Внешние ссылки
- Руководство Intel по внутренним функциям
- Использование процедур milicode , документация IBM AIX 6.1