Articulo de referencia

Futhark (lenguaje de programación)

{{Cite web |title=License |url=https://futhark-lang.org/license.html |access-date=2023-03-26 |website=futhark-lang.org |quote=Developed at [[UCPH Department of Computer Science|...

Futhark es un lenguaje de programación de matrices , funcional , de alto nivel y multiparadigma , paralelismo de datos . Es un dialecto del lenguaje ML , desarrollado originalmente en el Departamento de Ciencias de la Computación de la UCPH (DIKU) como parte del proyecto HIPERFIT. [ 2 ] Se centra en permitir que los programas de paralelismo de datos escritos en un estilo funcional se ejecuten con alto rendimiento en hardware masivamente paralelo , especialmente en unidades de procesamiento gráfico (GPU). Futhark está fuertemente inspirado en NESL , y su implementación utiliza una variante de la transformación de aplanamiento , pero impone restricciones sobre cómo se puede expresar el paralelismo para permitir optimizaciones de compilador más agresivas. En particular, no admite el paralelismo de datos anidado irregular. [ 3 ] Es software libre y de código abierto publicado bajo una licencia ISC .

Descripción general

Futhark es un lenguaje de la familia ML , con una sintaxis insensible a la indentación derivada de OCaml , Standard ML y Haskell . El sistema de tipos se basa en un sistema de tipos Hindley-Milner con diversas extensiones, como tipos de unicidad y tipos dependientes del tamaño . Futhark no está pensado como un lenguaje de programación de propósito general para escribir aplicaciones completas, sino que se centra en la escritura de núcleos de cómputo (no siempre iguales a un núcleo de GPU ) que luego se invocan desde aplicaciones escritas en lenguajes convencionales. [ 4 ]

El futhark recibe su nombre de las primeras seis letras del alfabeto rúnico . [ 5 ] : 2

Ejemplos

producto escalar

El siguiente programa calcula el producto escalar de dos vectores que contienen números de doble precisión.

def dotprod xs ys = f64 . sum ( map2 ( * ) xs ys ))

También se puede escribir de forma equivalente con anotaciones de tipo explícitas de la siguiente manera.

def dotprod [ n ] ( xs : [ n ] f64 ) ( ys : [ n ] f64 ) : f64 = f64 . sum ( map2 ( * ) xs ys ))

Esto hace explícitos los tipos que dependen del tamaño: esta función solo se puede invocar con dos matrices del mismo tamaño, y el verificador de tipos rechazará cualquier programa en el que esto no se pueda determinar estáticamente.

multiplicación de matrices

El siguiente programa realiza una multiplicación de matrices , utilizando la definición de producto escalar descrita anteriormente.

def matmul [ n ][ m ][ p ] ( A : [ n ][ m ] f64 ) ( B : [ m ][ p ] f64 ) : [ n ][ p ] f64 = map ( \ A_row -> map ( \ B_col -> dotprod A_row B_col ) ( transpose B )) A

Esto demuestra cómo los tipos garantizan que la función solo se invoque con matrices de tamaño compatible. Además, es un ejemplo de paralelismo de datos anidado .

Referencias

  1. "Licencia" . futhark-lang.org . Consultado el 26 de marzo de 2023. Desarrollado en DIKU .
  2. "Inicio" . hiperfit.dk .
  3. Henriksen, Troels; Serup, Niels GW; Elsman, Martin; Henglein, Fritz; Oancea, Cosmin (2017). "Futhark: Programación GPU puramente funcional con paralelismo anidado y actualizaciones de matrices in situ" (PDF) . Actas de la 38.ª Conferencia ACM SIGPLAN sobre diseño e implementación de lenguajes de programación . PLDI 2017. ACM.
  4. "Guía del usuario de Futhark" . futhark.readthedocs.io .
  5. Troels, Henriksen (noviembre de 2017). Diseño e implementación del lenguaje de programación Futhark (PDF) (tesis doctoral). Universidad de Copenhague . Recuperado el 25 de mayo de 2024 .