stringtranslate.com

función intrínseca

En software de computadora , en teoría del compilador, una función intrínseca , también llamada función incorporada o función incorporada , es una función ( subrutina ) disponible para su uso en un lenguaje de programación determinado cuya implementación es manejada especialmente por el compilador . Normalmente, puede sustituir una secuencia de instrucciones generadas automáticamente para la llamada a la función original, similar a una función en línea . [1] A diferencia de una función en línea, el compilador tiene un conocimiento profundo de una función intrínseca y, por lo tanto, puede integrarla y optimizarla mejor para una situación determinada.

Los compiladores que implementan funciones intrínsecas pueden habilitarlas solo cuando un programa solicita optimización ; de lo contrario, recurren a una implementación predeterminada proporcionada por el sistema de ejecución del lenguaje (entorno).

Vectorización y paralelización

Las funciones intrínsecas se utilizan a menudo para implementar explícitamente la vectorización y la paralelización en lenguajes que no abordan dichas construcciones. Algunas interfaces de programación de aplicaciones (API), por ejemplo, AltiVec y OpenMP , utilizan funciones intrínsecas para declarar, respectivamente, operaciones vectorizables y multiprocesamiento durante la compilación. El compilador analiza las funciones intrínsecas y las convierte en matemáticas vectoriales o código objeto de multiprocesamiento apropiado para la plataforma de destino . Algunos intrínsecos se utilizan para proporcionar restricciones adicionales al optimizador, como valores que una variable no puede asumir. [2]

Por lenguaje de programación

C y C++

Los compiladores para C y C++ de Microsoft, [3] Intel, [1] y GNU Compiler Collection (GCC) [4] implementan elementos intrínsecos que se asignan directamente a las instrucciones x86 de instrucción única y datos múltiples ( SIMD ) ( MMX , Streaming SIMD Extensiones (SSE), SSE2 , SSE3 , SSSE3 , SSE4 , AVX , AVX2 , AVX512 , FMA , ...). El compilador Microsoft Visual C++ de Microsoft Visual Studio no admite el ensamblaje en línea para x86-64 . [5] [6] [7] [8] Para compensar esto, se han agregado nuevos elementos intrínsecos que se asignan a instrucciones de ensamblaje estándar a las que normalmente no se puede acceder a través de C/C++, por ejemplo, escaneo de bits.

Algunos compiladores de C y C++ proporcionan elementos intrínsecos específicos de la plataforma no portátiles. Otros elementos intrínsecos (como los integrados de GNU ) son un poco más abstractos y se aproximan a las capacidades de varias plataformas contemporáneas, con implementaciones portátiles de respaldo en plataformas sin instrucciones apropiadas. [9] Es común que las bibliotecas C++, como glm o las bibliotecas matemáticas vectoriales de Sony , [10] logren portabilidad mediante compilación condicional (basada en indicadores de compilador específicos de la plataforma), proporcionando primitivas de alto nivel totalmente portátiles (por ejemplo, un tipo vectorial de punto flotante de cuatro elementos) asignado a las implementaciones apropiadas del lenguaje de programación de bajo nivel , sin dejar de beneficiarse del sistema de tipos C++ y la integración; de ahí la ventaja sobre la vinculación a archivos de objetos ensamblados escritos a mano, utilizando la interfaz binaria de aplicación C (ABI).

Ejemplos

 uint64_t __rdtsc (); // devuelve el contador de reloj interno de la CPU uint64_t __popcnt64 ( uint64_t n ); // recuento de bits configurado en n uint64_t _umul128 ( uint64_t Factor1 , uint64_t Factor2 , uint64_t * HighProduct ); // 64 bits * 64 bits => multiplicación de 128 bits __m512 _mm512_add_ps ( __m512 a , __m512 b ); // calcula a + b para dos vectores de 16 flotantes __m512 _mm512_fmadd_ps ( __m512 a , __m512 b , __m512 c ); // calcula a*b + c para tres vectores de 16 flotantes                                

Enlaces

Java

El compilador justo a tiempo de la máquina virtual Java (JVM) de HotSpot también tiene elementos intrínsecos para API de Java específicas. [11] Los intrínsecos de Hotspot son API de Java estándar que pueden tener una o más implementaciones optimizadas en algunas plataformas.

PL/I

ANSI/ISO PL/I define casi 90 funciones integradas. [12] Estos se agrupan convencionalmente de la siguiente manera: [13] : 337–338 

Los compiladores individuales han agregado elementos integrados adicionales específicos de la arquitectura de una máquina o del sistema operativo.

Una función incorporada se identifica dejando su nombre sin declarar y permitiéndole que actúe de forma predeterminada, o declarándolo BUILTIN. Una función proporcionada por el usuario con el mismo nombre se puede sustituir declarándola como ENTRY.

Referencias

  1. ^ ab "Guía y referencia para desarrolladores del compilador Intel® C++ 19.1". Documentación del compilador Intel® C++ . 16 de diciembre de 2019 . Consultado el 17 de enero de 2020 .
  2. ^ El equipo Clang (2020). "Extensiones del lenguaje Clang". Documentación de Clang 11 . Consultado el 17 de enero de 2020 . Funciones integradas
  3. ^ MSDN . "Conceptos intrínsecos del compilador". Microsoft . Consultado el 20 de junio de 2012 .
  4. ^ Documentación del CCG. "Funciones integradas específicas para máquinas de destino concretas". Fundación de Software Libre . Consultado el 20 de junio de 2012 .
  5. ^ MSDN . "Intrínsecos y ensamblaje en línea". Microsoft . Archivado desde el original el 2018-01-02 . Consultado el 16 de abril de 2010 .
  6. ^ MSDN . "Intrínsecos y ensamblaje en línea". Microsoft . Consultado el 28 de septiembre de 2011 .
  7. ^ MSDN . "Intrínsecos y ensamblaje en línea". Microsoft . Consultado el 28 de septiembre de 2011 .
  8. ^ MSDN . "Intrínsecos y ensamblaje en línea". Microsoft . Consultado el 28 de septiembre de 2011 .
  9. ^ "Extensiones vectoriales". Usando la colección de compiladores GNU (GCC) . Consultado el 16 de enero de 2020 .
  10. ^ "Bibliotecas matemáticas SIMD y Vector Math de código abierto de Sony (Cell PPU/SPU/otras plataformas)". Foro Beyond3D . Consultado el 17 de enero de 2020 .
  11. ^ Mok, Kris (25 de febrero de 2013). "Métodos intrínsecos en HotSpot VM". Compartir diapositivas . Consultado el 20 de diciembre de 2014 .
  12. ^ Comité ANSI X3 (1976). Lenguaje de programación estándar nacional americano PL/I .{{cite book}}: Mantenimiento CS1: nombres numéricos: lista de autores ( enlace )
  13. ^ Corporación IBM (1995). Referencia del lenguaje IBM PL/I para MVS y VM .

enlaces externos