Articulo de referencia

Coarray Fortran

Coarray Fortran ( CAF ), anteriormente conocido como F-- , comenzó como una extensión de Fortran 95/2003 para procesamiento paralelo , creada por Robert Numrich y John Reid en l...

Coarray Fortran ( CAF ), anteriormente conocido como F-- , comenzó como una extensión de Fortran 95/2003 para procesamiento paralelo , creada por Robert Numrich y John Reid en la década de 1990. El estándar Fortran 2008 (ISO/IEC 1539-1:2010) ahora incluye coarrays (escrito sin guion), según lo decidido en la reunión de mayo de 2005 del Comité ISO Fortran; la sintaxis en el estándar Fortran 2008 es ligeramente diferente de la propuesta CAF original.

Un programa CAF se interpreta como si se replicara varias veces y todas las copias se ejecutaran de forma asíncrona. Cada copia tiene su propio conjunto de objetos de datos y se denomina imagen . La sintaxis de matrices de Fortran se amplía con subíndices adicionales entre corchetes para proporcionar una representación concisa de las referencias a los datos distribuidos en varias imágenes.

La extensión CAF se implementó en algunos compiladores de Fortran , como los de Cray (desde la versión 3.1). Desde la inclusión de coarrays en el estándar Fortran 2008, el número de implementaciones está creciendo. El primer compilador de código abierto que implementó coarrays según lo especificado en el estándar Fortran 2008 para arquitecturas Linux es G95 . Actualmente, GNU Fortran ofrece una amplia cobertura de las características de coarrays de Fortran en configuraciones de imagen única y múltiple (esta última basada en la biblioteca OpenCoarrays). Otra implementación de coarrays y extensiones paralelas relacionadas de Fortran 2008 está disponible en el compilador OpenUH (una rama de Open64 ) desarrollado en la Universidad de Houston .

Implementación en compiladores

CAF se suele implementar sobre una biblioteca de Interfaz de Paso de Mensajes (MPI) para garantizar la portabilidad. Algunas implementaciones, como las disponibles en los compiladores GNU Fortran y OpenUH, pueden ejecutarse sobre otras capas de bajo nivel (por ejemplo, GASNet) diseñadas para admitir lenguajes con espacio de direcciones global particionado .

Ejemplos

A continuación se muestra un ejemplo sencillo. CAF se utiliza en CGPACK, un paquete de código abierto para simular materiales policristalinos desarrollado en la Universidad de Bristol . [ 1 ]

programa Hello_World implícito ninguno entero :: i ! Variable local carácter ( len = 20 ) :: nombre [ * ] ! matriz escalar, un "nombre" para cada imagen. ! Nota: "nombre" es la variable local mientras que "nombre[<índice>]" accede a la ! variable en una imagen específica; "nombre[esta_imagen()]" es lo mismo que "nombre".¡Interactúa con el usuario en la Imagen 1; la ejecución para todas las demás continúa. Si ( this_image () == 1 ) entonces  escribe ( * , '(a)' , avanza = 'no' ) 'Ingresa tu nombre: ' lee ( * , '(a)' ) nombre! Distribuir información a otras imágenes hacer i = 2 , num_images () nombre [ i ] = nombre fin hacer  fin si ¡Sincronizar todo ! Barrera para asegurar que los datos hayan llegado.! E/S de todas las imágenes, ejecutándose en cualquier orden, pero cada registro escrito permanece intacto. write ( * , '(3a,i0)' ) 'Hola ' , trim ( nombre ), ' desde la imagen ' , this_image () fin del programa Hola_mundo

El programa anterior tiene un rendimiento deficiente debido a que el bucle que distribuye la información se ejecuta secuencialmente. Escribir programas escalables a menudo requiere una comprensión sofisticada de los algoritmos paralelos, un conocimiento detallado de las características de la red subyacente y una optimización especial para las características de la aplicación, como el tamaño de las transferencias de datos. Para la mayoría de los desarrolladores de aplicaciones, dejar que el compilador o la biblioteca de tiempo de ejecución decidan el mejor algoritmo resulta más robusto y de alto rendimiento. Fortran 2018 ofrecerá subrutinas de comunicación colectiva que permiten a los equipos de compiladores y bibliotecas de tiempo de ejecución encapsular algoritmos paralelos eficientes para la comunicación colectiva y la computación distribuida en un conjunto de subrutinas colectivas. Estas subrutinas y otras nuevas características de programación paralela se resumen en una especificación técnica [ 2 ] que el comité de estándares de Fortran ha votado incorporar en Fortran 2018. Esto permite al usuario escribir una versión más eficiente del algoritmo anterior.

programa Hello_World implicit none character ( len = 20 ) :: name [ * ] ! scalar coarray, un "name" para cada imagen. ! Nota: "name" es la variable local mientras que "name[<index>]" accede a la ! variable en una imagen específica; "name[this_image()]" es lo mismo que "name".! Interactúa con el usuario en la Imagen 1; la ejecución para todas las demás pasa. if ( this_image () == 1 ) then  write ( * , '(a)' , advance = 'no' ) 'Ingrese su nombre: ' read ( * , '(a)' ) name end if ! Distribuye información a todas las imágenes call co_broadcast ( name , source_image = 1 )! E/S de todas las imágenes, ejecutándose en cualquier orden, pero cada registro escrito permanece intacto. write ( * , '(3a,i0)' ) 'Hola ' , trim ( nombre ), ' desde la imagen ' , this_image () fin del programa Hola_mundo

donde la falta de sincronización explícita ofrece el potencial de un mayor rendimiento debido a una menor coordinación entre las imágenes. Además, TS 18508 garantiza que "No se puede realizar una transferencia desde una imagen antes de que se haya invocado la subrutina colectiva en esa imagen". Esto implica cierta sincronización parcial dentro de co_broadcast, pero podría ser de mayor rendimiento que la opción "sincronizar todo" del ejemplo anterior. TS 18508 también incorpora varias otras características nuevas que abordan los problemas que aborda el proyecto CAF 2.0 que se describe a continuación. Algunos ejemplos incluyen equipos de imágenes y eventos.

Una perspectiva alternativa

En 2011, la Universidad Rice impulsó una visión alternativa de las extensiones de coarray para el lenguaje Fortran. [ 3 ] Su perspectiva es que las decisiones de diseño del comité de estándares de Fortran 2008 estuvieron más influenciadas por el deseo de introducir la menor cantidad posible de modificaciones al lenguaje que por reunir el mejor conjunto de extensiones para soportar la programación paralela . En su opinión, tanto el diseño original de Numrich y Reid como las extensiones de coarray propuestas para Fortran 2008 adolecen de las siguientes deficiencias:

  • No se admite el uso de subconjuntos de procesadores ; por ejemplo, los co-arrays deben asignarse a todas las imágenes.
  • Las extensiones de coarray carecen de cualquier noción de punteros globales, que son esenciales para crear y manipular cualquier tipo de estructura de datos enlazada.
  • La dependencia de secciones críticas con nombre para la exclusión mutua dificulta el paralelismo escalable al asociar la exclusión mutua con regiones de código en lugar de con objetos de datos.
  • La instrucción `sync images` de Fortran 2008 no proporciona un espacio de sincronización seguro. Como resultado, las operaciones de sincronización en el código del usuario que estén pendientes cuando se realiza una llamada a una biblioteca pueden interferir con la sincronización en dicha llamada.
  • No existen mecanismos para evitar o tolerar la latencia al manipular datos en imágenes remotas.
  • No existe apoyo para la comunicación colectiva.

Para abordar estas deficiencias, el grupo de la Universidad Rice está desarrollando un rediseño completo del modelo de programación Coarray Fortran. El nuevo diseño de Rice para Coarray Fortran, al que llaman Coarray Fortran 2.0, es un conjunto expresivo de extensiones basadas en coarray para Fortran, diseñadas para proporcionar un modelo de programación paralela productivo . En comparación con Fortran 2008, las nuevas extensiones de lenguaje basadas en coarray de Rice incluyen algunas características adicionales:

  • subconjuntos de procesos conocidos como equipos, que admiten coarrays, comunicación colectiva e indexación relativa de imágenes de procesos para operaciones por pares,
  • topologías, que complementan a los equipos con una estructura de comunicación lógica,
  • asignación/desasignación dinámica de co-arrays y otros datos compartidos,
  • asignación y desasignación de coarrays basada en equipos,
  • punteros globales en soporte de estructuras de datos dinámicas,
  • soporte para ocultar y evitar la latencia, y
    • copias asíncronas,
    • operaciones colectivas asíncronas y
    • función de envío.
  • Soporte mejorado para la sincronización, que permite un control preciso de la ejecución del programa.
    • Soporte seguro y escalable para la exclusión mutua, incluyendo cerraduras y conjuntos de cerraduras,
    • eventos, que proporcionan un espacio seguro para la sincronización punto a punto,
    • cofence , que fuerza la finalización local de operaciones asíncronas,
    • finish, una estructura SPMD similar a una barrera que fuerza la finalización de operaciones asíncronas en todo un equipo,

Véase también

Referencias

  1. A. Shterenlikht, Biblioteca de matrices Fortran para simulación de microestructuras de autómatas celulares 3D Archivado el 4 de marzo de 2016 en Wayback Machine , (2013) En Proc. 7th PGAS conf, Eds. M. Weiland, A. Jackson, N. Johnson, Publicado por la Universidad de Edimburgo, ISBN 978-0-9926615-0-2
  2. TS 18508 Funcionalidades paralelas adicionales en Fortran
  3. "CoArray Fortran 2.0" .

General

Obtenido de " https://en.wikipedia.org/w/index.php?title=Coarray_Fortran&oldid=1291252378 "