WikiDer > Внутренняя функция - Википедия
Эта статья нужны дополнительные цитаты для проверка. (Декабрь 2009 г.) (Узнайте, как и когда удалить этот шаблон сообщения) |
В компьютерное программное обеспечение, в теории компиляторов внутренняя функция (или же встроенная функция) - функция (подпрограмма) доступны для использования в данном язык программирования чья реализация специально обрабатывается компилятор. Как правило, он может заменять последовательность автоматически сгенерированных инструкции для исходного вызова функции, аналогично встроенная функция.[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, которые могут иметь одну или несколько оптимизированных реализаций на некоторых платформах.
Рекомендации
- ^ а б «Руководство и справочник разработчика Intel® C ++ Compiler 19.1». Документация по компилятору Intel® C ++. 16 декабря 2019 г.. Получено 2020-01-17.
- ^ Команда Clang (2020). "Расширения языка Clang". Документация Clang 11. Получено 2020-01-17.
Встроенные функции
- ^ MSDN (VS2010). "Внутренние функции компилятора". Microsoft. Получено 2012-06-20.
- ^ Документация GCC. «Встроенные функции, специфичные для конкретных целевых машин». Фонд свободного программного обеспечения. Получено 2012-06-20.
- ^ MSDN (VS2012). «Внутренняя и встроенная сборка». Microsoft. Архивировано из оригинал на 2018-01-02. Получено 2010-04-16.
- ^ MSDN (VS2010). «Внутренняя и встроенная сборка». Microsoft. Получено 2011-09-28.
- ^ MSDN (VS2008). «Внутренняя и встроенная сборка». Microsoft. Получено 2011-09-28.
- ^ MSDN (VS2005). «Внутренняя и встроенная сборка». Microsoft. Получено 2011-09-28.
- ^ "Векторные расширения". Использование коллекции компиляторов GNU (GCC). Получено 2020-01-16.
- ^ «Sony с открытым исходным кодом векторной математики и математических библиотек SIMD (Cell PPU / SPU / другие платформы)». Форум Beyond3D. Получено 2020-01-17.
- ^ Мок, Крис (25 февраля 2013 г.). «Внутренние методы в HotSpot VM». Slideshare. Получено 2014-12-20.
внешняя ссылка
- Руководство Intel Intrinsics
- Использование подпрограмм milicode, Документация по IBM AIX 6.1