Внутренняя функция - Intrinsic function - Wikipedia

В компьютерное программное обеспечение, в теории компиляторов внутренняя функция (или же встроенная функция) - функция (подпрограмма ) доступны для использования в данном язык программирования чья реализация специально обрабатывается компилятор. Как правило, он может заменять последовательность автоматически сгенерированных инструкции для исходного вызова функции, аналогично встроенная функция.[1] В отличие от встроенной функции, компилятор хорошо знает внутреннюю функцию и, таким образом, может лучше интегрировать и оптимизировать ее для данной ситуации.

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

Внутренние функции часто используются для явной реализации векторизация и распараллеливание на языках, в которых такие конструкции не рассматриваются. Немного интерфейсы прикладного программирования (API), например, AltiVec и OpenMP, используйте встроенные функции для объявления, соответственно, векторизуемых и многопроцессорность -сознательные операции при компиляции. Компилятор анализирует внутренние функции и преобразует их в векторную математику или многопроцессорную обработку. объектный код подходит для цели Платформа.Некоторые встроенные функции используются для предоставления дополнительных ограничений оптимизатору, например значений, которые переменная не может принимать.[2]

C и C ++

Компиляторы для C и C ++, Microsoft,[3]Intel,[1] и Коллекция компиляторов GNU (GCC)[4]реализовать встроенные функции, которые отображаются непосредственно на x86 одна инструкция, несколько данных (SIMD ) инструкции (MMX, Потоковые расширения SIMD (SSE), SSE2, SSE3, SSSE3, SSE4, AVX, AVX2, AVX512, FMA, ...). В Microsoft Visual C ++ составитель Microsoft Visual Studio не поддерживает встроенный сборка за x86-64.[5][6][7][8] Чтобы компенсировать это, были добавлены новые встроенные функции, которые отображаются на стандартные инструкции сборки, которые обычно недоступны через C / C ++, например, битовое сканирование.

Некоторые компиляторы C и C ++ предоставляют непереносимые встроенные функции, специфичные для платформы. Другие встроенные функции (например, GNU встроенные модули) немного более абстрактны, приближаясь к возможностям нескольких современных платформ, с портативными отступать реализации на платформах без соответствующих инструкций.[9] Это обычное дело для библиотек C ++, таких как glm или же Sony с векторные математические библиотеки,[10] для достижения переносимости через условная компиляция (на основе флагов компилятора, зависящих от платформы), обеспечивая полностью переносимые высокоуровневые примитивы (например, четырехэлементный векторный тип с плавающей запятой), отображаемый на соответствующие язык программирования низкого уровня реализации, при этом все еще пользуясь преимуществами системы типов C ++ и встраивания; отсюда преимущество перед связыванием с рукописными объектными файлами сборки с использованием языка C двоичный интерфейс приложения (ABI).

Примеры

 uint64_t __rdtsc        ();                                                          // возвращаем внутренний счетчик тактовой частоты процессора uint64_t __popcnt64     (uint64_t п);                                                // количество битов, установленных в n uint64_t _umul128       (uint64_t Фактор1, uint64_t Фактор2, uint64_t* HighProduct); // 64 бит * 64 бит => 128 битное умножение __m512   _mm512_add_ps  (__m512 а, __m512 б);                                        // вычисляет a + b для двух векторов из 16 чисел с плавающей запятой __m512   _mm512_fmadd_ps(__m512 а, __m512 б, __m512 c);                              // вычисляет a * b + c для трех векторов из 16 чисел с плавающей запятой
Ссылки

Ява

В HotSpot Виртуальная машина Java (JVM) своевременный компилятор также имеет встроенные функции для конкретных API Java.[11] Встроенные функции Hotspot - это стандартные API-интерфейсы Java, которые могут иметь одну или несколько оптимизированных реализаций на некоторых платформах.

Рекомендации

  1. ^ а б «Руководство и справочник разработчика Intel® C ++ Compiler 19.1». Документация по компилятору Intel® C ++. 16 декабря 2019 г.. Получено 2020-01-17.
  2. ^ Команда Clang (2020). "Расширения языка Clang". Документация Clang 11. Получено 2020-01-17. Встроенные функции
  3. ^ MSDN (VS2010). "Внутренние функции компилятора". Microsoft. Получено 2012-06-20.
  4. ^ Документация GCC. «Встроенные функции, специфичные для конкретных целевых машин». Фонд свободного программного обеспечения. Получено 2012-06-20.
  5. ^ MSDN (VS2012). «Внутренняя и встроенная сборка». Microsoft. Архивировано из оригинал на 2018-01-02. Получено 2010-04-16.
  6. ^ MSDN (VS2010). «Внутренняя и встроенная сборка». Microsoft. Получено 2011-09-28.
  7. ^ MSDN (VS2008). «Внутренняя и встроенная сборка». Microsoft. Получено 2011-09-28.
  8. ^ MSDN (VS2005). «Внутренняя и встроенная сборка». Microsoft. Получено 2011-09-28.
  9. ^ "Векторные расширения". Использование коллекции компиляторов GNU (GCC). Получено 2020-01-16.
  10. ^ «Sony с открытым исходным кодом векторной математики и математических библиотек SIMD (Cell PPU / SPU / другие платформы)». Форум Beyond3D. Получено 2020-01-17.
  11. ^ Мок, Крис (25 февраля 2013 г.). «Внутренние методы в HotSpot VM». Slideshare. Получено 2014-12-20.

внешняя ссылка