En el software de computadora , en la teoría del compilador, una función intrínseca (o función incorporada ) es una función ( subrutina ) disponible para su uso en un lenguaje de programación dado cuya implementación es manejada especialmente por el compilador . Normalmente, puede sustituir una secuencia de instrucciones generadas automáticamente por la llamada de 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 íntimo de una función intrínseca y, por lo tanto, puede integrarla y optimizarla mejor para una situación dada.
Los compiladores que implementan funciones intrínsecas generalmente las habilitan 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).
Las funciones intrínsecas se utilizan a menudo para implementar explícitamente la vectorización y la paralelización en lenguajes que no abordan tales 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 elementos intrínsecos se utilizan para proporcionar restricciones adicionales al optimizador, como valores que una variable no puede asumir. [2]
C y C ++
Los compiladores para C y C ++ , de Microsoft, [3] Intel, [1] y GNU Compiler Collection (GCC) [4] implementan intrínsecos que se asignan directamente a la instrucción única x86 , instrucciones de datos múltiples ( SIMD ) ( MMX , Streaming SIMD Extensiones (SSE), SSE2 , SSE3 , SSSE3 , SSE4 , AVX , AVX2 , AVX512 , FMA , ...). El compilador de Microsoft Visual C ++ de Microsoft Visual Studio no admite el ensamblado en línea para x86-64 . [5] [6] [7] [8] Para compensar esto, se han agregado nuevos intrínsecos que se asignan a las instrucciones de ensamblaje estándar que normalmente no son accesibles 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 incorporados de GNU ) son un poco más abstractos, aproximándose a las capacidades de varias plataformas contemporáneas, con implementaciones de respaldo portátiles en plataformas sin instrucciones apropiadas. [9] Es común que las bibliotecas de C ++, como glm o las bibliotecas de matemáticas vectoriales de Sony , [10] logren la portabilidad a través de la compilación condicional (basada en indicadores de compilación específicos de la plataforma), proporcionando primitivas de alto nivel totalmente portátiles (por ejemplo, un tipo de vector de punto flotante de cuatro elementos) mapeado en las implementaciones apropiadas del lenguaje de programación de bajo nivel , sin dejar de beneficiarse del sistema de tipo C ++ y el inlining; de ahí la ventaja sobre la vinculación a archivos de objeto de ensamblaje escritos a mano, utilizando la interfaz binaria de la aplicación C (ABI).
Ejemplos de
uint64_t __rdtsc (); // devuelve el contador de reloj interno de la CPU uint64_t __popcnt64 ( uint64_t n ); // recuento de bits establecidos 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
- Intrínsecos de Intel
Java
El compilador Just - In -Time de la máquina virtual Java HotSpot (JVM) también tiene elementos intrínsecos para API específicas de Java. [11] Los elementos intrínsecos de Hotspot son API estándar de Java que pueden tener una o más implementaciones optimizadas en algunas plataformas.
Referencias
- ^ a b "Guía y referencia para desarrolladores Intel® C ++ Compiler 19.1" . Documentación del compilador Intel® C ++ . 16 de diciembre de 2019 . Consultado el 17 de enero de 2020 .
- ^ El equipo de Clang (2020). "Extensiones de lenguaje Clang" . Documentación de Clang 11 . Consultado el 17 de enero de 2020 .
Funciones integradas
- ^ MSDN . "Intrínsecos del compilador" . Microsoft . Consultado el 20 de junio de 2012 .
- ^ Documentación de GCC. "Funciones integradas específicas para máquinas específicas de destino" . Fundación de Software Libre . Consultado el 20 de junio de 2012 .
- ^ MSDN . "Ensamblaje intrínseco y en línea" . Microsoft . Archivado desde el original el 2 de enero de 2018 . Consultado el 16 de abril de 2010 .
- ^ MSDN . "Ensamblaje intrínseco y en línea" . Microsoft . Consultado el 28 de septiembre de 2011 .
- ^ MSDN . "Ensamblaje intrínseco y en línea" . Microsoft . Consultado el 28 de septiembre de 2011 .
- ^ MSDN . "Ensamblaje intrínseco y en línea" . Microsoft . Consultado el 28 de septiembre de 2011 .
- ^ "Extensiones vectoriales" . Usando la colección de compiladores GNU (GCC) . Consultado el 16 de enero de 2020 .
- ^ "Sony open sources Vector Math y bibliotecas matemáticas SIMD (Cell PPU / SPU / otras plataformas)" . Foro Beyond3D . Consultado el 17 de enero de 2020 .
- ^ Mok, Kris (25 de febrero de 2013). "Métodos intrínsecos en HotSpot VM" . Slideshare . Consultado el 20 de diciembre de 2014 .
enlaces externos
- Guía de intrínsecos de Intel
- Uso de rutinas milicode , documentación de IBM AIX 6.1