Función intrínseca

Función cuya implementación es manejada especialmente por el compilador

En software de computadora , en teoría de compiladores, 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 dado cuya implementación es manejada especialmente por el compilador . Típicamente, 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 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 que admiten multiprocesamiento durante la compilación. El compilador analiza las funciones intrínsecas y las convierte en código objeto de multiprocesamiento o matemática vectorial apropiado para la plataforma de destino . Algunas funciones intrínsecas 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 intrínsecos que se asignan directamente a las instrucciones de instrucción única, múltiples datos ( SIMD ) x86 ( MMX , Streaming SIMD Extensions (SSE), SSE2 , SSE3 , SSSE3 , SSE4 , AVX , AVX2 , AVX512 , FMA , ...). El compilador Microsoft Visual C++ de Microsoft Visual Studio no admite ensamblaje en línea para x86-64 . [5] [6] [7] [8] Para compensar esto, se han agregado nuevos intrínsecos que se asignan a 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 intrínsecos específicos de la plataforma que no son portables. Otros intrínsecos (como los integrados de GNU ) son ligeramente más abstractos, aproximándose 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 de C++, como glm o las bibliotecas de matemáticas vectoriales de Sony , [10] logren portabilidad a través de la compilación condicional (basada en indicadores de compilador específicos de la plataforma), proporcionando primitivas de alto nivel totalmente portables (por ejemplo, un tipo de vector de punto flotante de cuatro elementos) mapeadas en las implementaciones de lenguaje de programación de bajo nivel apropiadas , mientras que aún se benefician del sistema de tipos de C++ y la incrustación; de ahí la ventaja sobre la vinculación a archivos de objetos de ensamblaje escritos a mano, utilizando la interfaz binaria de aplicación (ABI) de C.

Ejemplos

 uint64_t __rdtsc (); // devuelve el contador de reloj interno de la CPU uint64_t __popcnt64 ( uint64_t n ); // recuento de bits establecido en n uint64_t _umul128 ( uint64_t Factor1 , uint64_t Factor2 , uint64_t * HighProduct ); // multiplicación de 64 bits * 64 bits => 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                                

[11]

Java

El compilador just-in-time de la máquina virtual Java (JVM) HotSpot también tiene intrínsecos para API de Java específicas. [12] Los intrínsecos de HotSpot son API de Java estándar que pueden tener una o más implementaciones optimizadas en algunas plataformas.

PL/Yo

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

  • Funciones integradas de manejo de cadenas como INDEX, LENGTH
  • Funciones aritméticas integradas como ABS, CEIL, ROUND
  • Funciones matemáticas integradas como SIN, COS, LOG, ERF
  • Funciones integradas de manejo de matrices, por ejemplo ANY, ALL, PROD
  • Funciones integradas de manejo de condiciones como ONCODE, ONFILE
  • Funciones integradas de control de almacenamiento, por ejemplo, ADDR, POINTER
  • Funciones integradas de entrada y salida: LINENO
  • Funciones integradas diversas como FECHA y HORA

Los compiladores individuales han agregado funciones integradas adicionales específicas para una arquitectura de máquina o un sistema operativo.

Una función incorporada se identifica dejando su nombre sin declarar y permitiendo que tenga el valor predeterminado, o declarándola como 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 de Clang (2020). "Extensiones del lenguaje Clang". Documentación de Clang 11. Consultado el 17 de enero de 2020. Funciones integradas
  3. ^ MSDN . «Compiler Intrinsics» (Intrínsecos del compilador). Microsoft . Consultado el 20 de junio de 2012 .
  4. ^ Documentación de GCC. «Funciones integradas específicas para determinadas máquinas de destino». Free Software Foundation . Consultado el 20 de junio de 2012 .
  5. ^ MSDN . «Intrinsics and Inline Assembly». Microsoft . Archivado desde el original el 2018-01-02 . Consultado el 2010-04-16 .
  6. ^ MSDN . "Intrinsics and Inline Assembly" (Intrínsecos y ensamblaje en línea). Microsoft . Consultado el 28 de septiembre de 2011 .
  7. ^ MSDN . "Intrinsics and Inline Assembly" (Intrínsecos y ensamblaje en línea). Microsoft . Consultado el 28 de septiembre de 2011 .
  8. ^ MSDN . "Intrinsics and Inline Assembly" (Intrínsecos y ensamblaje en línea). Microsoft . Consultado el 28 de septiembre de 2011 .
  9. ^ "Extensiones de vectores". Uso de la colección de compiladores GNU (GCC) . Consultado el 16 de enero de 2020 .
  10. ^ "Sony publica en código abierto las bibliotecas matemáticas Vector Math y SIMD (Cell PPU/SPU/otras plataformas)". Foro Beyond3D . Archivado desde el original el 24 de junio de 2016. Consultado el 17 de enero de 2020 .
  11. ^ Intrínsecos de Intel
  12. ^ Mok, Kris (25 de febrero de 2013). "Métodos intrínsecos en HotSpot VM". Slideshare . Consultado el 20 de diciembre de 2014 .
  13. ^ Comité ANSI X3 (1976). Lenguaje de programación estándar nacional estadounidense PL/I .{{cite book}}: CS1 maint: nombres numéricos: lista de autores ( enlace )
  14. ^ IBM Corporation (1995). Referencia del lenguaje IBM PL/I para MVS y VM .
  • Guía de intrínsecos de Intel
  • Uso de rutinas de milicode, documentación de IBM AIX 6.1
Obtenido de "https://es.wikipedia.org/w/index.php?title=Función_intrínseca&oldid=1245185686"