stringtranslate.com

Внутренняя функция

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

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

Векторизация и распараллеливание

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

По языку программирования

С и С++

Компиляторы для C и C++ от Microsoft, [3] Intel, [1] и GNU Compiler Collection (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 ); // количество битов, заданное в 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 чисел с плавающей запятой                                

Ссылки

Джава

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

ПЛ/И

ANSI/ISO PL/I определяет около 90 встроенных функций. [12] Условно они сгруппированы следующим образом: [13] : 337–338. 

Отдельные компиляторы добавили дополнительные встроенные функции, специфичные для машинной архитектуры или операционной системы.

Встроенная функция идентифицируется, оставляя ее имя необъявленным и разрешая использовать значение по умолчанию, или путем ее объявления BUILTIN. Пользовательскую функцию с тем же именем можно заменить, объявив ее как ENTRY.

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

  1. ^ ab «Руководство и справочник для разработчиков компилятора Intel® C++ 19.1». Документация по компилятору Intel® C++ . 16 декабря 2019 года . Проверено 17 января 2020 г.
  2. ^ Команда Clang (2020). «Расширения языка Clang». Документация Clang 11 . Проверено 17 января 2020 г. Встроенные функции
  3. ^ MSDN . «Внутренности компилятора». Майкрософт . Проверено 20 июня 2012 г.
  4. ^ Документация GCC. «Встроенные функции, специфичные для конкретных целевых машин». Фонд свободного программного обеспечения . Проверено 20 июня 2012 г.
  5. ^ MSDN . «Внутренности и встроенная сборка». Майкрософт . Архивировано из оригинала 2 января 2018 г. Проверено 16 апреля 2010 г.
  6. ^ MSDN . «Внутренности и встроенная сборка». Майкрософт . Проверено 28 сентября 2011 г.
  7. ^ MSDN . «Внутренности и встроенная сборка». Майкрософт . Проверено 28 сентября 2011 г.
  8. ^ MSDN . «Внутренности и встроенная сборка». Майкрософт . Проверено 28 сентября 2011 г.
  9. ^ «Векторные расширения». Использование коллекции компиляторов GNU (GCC) . Проверено 16 января 2020 г.
  10. ^ «Математические библиотеки Vector Math и SIMD с открытым исходным кодом Sony (Cell PPU/SPU/другие платформы)» . Форум Beyond3D . Проверено 17 января 2020 г.
  11. Мок, Крис (25 февраля 2013 г.). «Внутренние методы в HotSpot VM». Слайдшер . Проверено 20 декабря 2014 г.
  12. ^ Комитет ANSI X3 (1976). Американский национальный стандартный язык программирования PL/I .{{cite book}}: CS1 maint: числовые имена: список авторов ( ссылка )
  13. ^ Корпорация IBM (1995). Справочник по языку IBM PL/I для MVS и VM .

Внешние ссылки