Coarray Fortran ( CAF ), anteriormente conocido como F-- , comenzó como una extensión de Fortran 95/2003 para el procesamiento paralelo creado 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 (escritos sin guión), como se decidió en la reunión de mayo de 2005 del Comité ISO Fortran; la sintaxis del estándar Fortran 2008 es ligeramente diferente de la propuesta original de CAF.
Paradigma | multi-paradigma : paralelo , paso de mensajes , imperativo ( procedimental , orientado a objetos ), estructurado |
---|---|
Diseñada por | Robert Numrich y John Reid |
Desarrollador | PL22.3 Comité Fortran |
Lanzamiento estable | Fortran 2008 (ISO / IEC 1539-1: 2010) |
Disciplina de mecanografía | fuerte , estático |
SO | Multiplataforma |
Implementaciones importantes | |
Cray, g95 , GNU Fortran , compilador Intel Fortran , Rice (CAF 2.0) , OpenUH , compilador NAG Fortran | |
Influenciado por | |
Fortran |
Un programa CAF se interpreta como si se hubiera replicado varias veces y todas las copias se hubieran ejecutado de forma asincrónica. Cada copia tiene su propio conjunto de objetos de datos y se denomina imagen . La sintaxis de matriz de Fortran se amplía con subíndices finales adicionales entre corchetes para proporcionar una representación concisa de las referencias a los datos que se distribuyen en las 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 como se especifica en el estándar Fortran 2008 para arquitecturas Linux es G95 . Actualmente, GNU Fortran proporciona una amplia cobertura de las funciones de coarray de Fortran en configuraciones de una o varias imágenes (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
A menudo, CAF se implementa sobre una biblioteca de interfaz de paso de mensajes (MPI) para su 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 de espacio de direcciones global particionado .
Ejemplos de
A continuación se ofrece 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 ! Carácter de variable local ( len = 20 ) :: nombre [ * ] ! coarray escalar, un "nombre" para cada imagen. ! Nota: "nombre" es la variable local, mientras que "nombre [<índice>]" accede a ! variable en una imagen específica; "nombre [this_image ()]" es lo mismo que "nombre". ! Interactuar con el usuario en la Imagen 1; ejecución para que todos los demás pasen. if ( this_image () == 1 ) then write ( * , '(a)' , advance = 'no' ) 'Ingrese su nombre:' read ( * , '(a)' ) name ! Distribuir información a otras imágenes do i = 2 , num_images () name [ i ] = name end do end if sincronizar todo ! Barrera para asegurarse de que los datos hayan llegado. ! E / S de todas las imágenes, ejecutándose en cualquier orden, pero cada registro escrito está intacto. write ( * , '(3a, i0)' ) 'Hola' , recortar ( nombre ), 'de la imagen' , this_image () finaliza el programa Hola_mundo
El programa anterior escala mal porque el ciclo que distribuye información se ejecuta secuencialmente. La escritura de 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 un ajuste 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 en 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 permitirán a los equipos de bibliotecas de tiempo de ejecución y compiladores 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 para incorporar en Fortran 2018. Éstas permiten al usuario escribir una versión más eficiente del algoritmo anterior.
programa Hello_World sin carácter implícito ( len = 20 ) :: nombre [ * ] ! coarray escalar, un "nombre" para cada imagen. ! Nota: "nombre" es la variable local, mientras que "nombre [<índice>]" accede a ! variable en una imagen específica; "nombre [this_image ()]" es lo mismo que "nombre". ! Interactuar con el usuario en la Imagen 1; ejecución para que todos los demás pasen. if ( this_image () == 1 ) then write ( * , '(a)' , advance = 'no' ) 'Ingrese su nombre:' read ( * , '(a)' ) name end if ! Distribuya información a todas las imágenes llame a co_broadcast ( nombre , source_image = 1 ) ! E / S de todas las imágenes, ejecutándose en cualquier orden, pero cada registro escrito está intacto. write ( * , '(3a, i0)' ) 'Hola' , recortar ( nombre ), 'de la imagen' , this_image () finaliza el 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 producir 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 tener un rendimiento más alto que "sincronizar todo" en el ejemplo anterior. TS 18508 también incorpora varias otras características nuevas que abordan los problemas que se enfocan en el esfuerzo de CAF 2.0 que se describe a continuación. Los ejemplos incluyen equipos de imágenes y eventos.
Una perspectiva alternativa
En 2011, Rice University buscó una visión alternativa de extensiones coarray para el lenguaje Fortran. [3] Su perspectiva es que las opciones de diseño del comité de estándares de Fortran 2008 fueron moldeadas más por el deseo de introducir la menor cantidad posible de modificaciones al lenguaje que por ensamblar 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 hay soporte para subconjuntos de procesadores ; por ejemplo, se deben asignar coarrays sobre todas las imágenes.
- Las extensiones de coarray carecen de la noción de punteros globales, que son esenciales para crear y manipular cualquier tipo de estructura de datos vinculados.
- 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 objetos de datos.
- La declaración de sincronización de imágenes 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 la biblioteca pueden interferir con la sincronización en la llamada a la biblioteca.
- No existen mecanismos para evitar o tolerar la latencia al manipular datos en imágenes remotas.
- No hay soporte para la comunicación colectiva.
Para abordar estas deficiencias, el grupo de la Universidad de Rice está desarrollando un rediseño limpio 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 expresivo conjunto de extensiones basadas en coarray para Fortran diseñadas para proporcionar un modelo productivo de programación paralela. 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 proceso para operaciones por pares,
- topologías, que aumentan los equipos con una estructura de comunicación lógica,
- asignación / desasignación dinámica de coarrays y otros datos compartidos,
- Asignación y desasignación de coarrays basada en equipo,
- punteros globales en apoyo de estructuras de datos dinámicas,
- soporte para ocultación y evitación de latencia, y
- copias asincrónicas,
- operaciones colectivas asincrónicas, y
- función de envío.
- soporte mejorado para la sincronización para un control detallado sobre la ejecución del programa.
- soporte seguro y escalable para la exclusión mutua, incluidos candados y juegos de candados,
- eventos, que proporcionan un espacio seguro para la sincronización punto a punto,
- cofence, que fuerza la finalización local de operaciones asincrónicas,
- Fin, una construcción SPMD similar a una barrera que fuerza la finalización de las operaciones asincrónicas en un equipo,
Ver también
Referencias
- ^ A. Shterenlikht, biblioteca de coarray de Fortran para simulación de microestructura de autómatas celulares 3D Archivado el 4 de marzo de 2016 en Wayback Machine , (2013) en Proc. Séptima conf. PGAS, Eds. M. Weiland, A. Jackson, N. Johnson, publicado por la Universidad de Edimburgo, ISBN 978-0-9926615-0-2
- ^ TS 18508 Funciones paralelas adicionales en Fortran
- ^ "CoArray Fortran 2.0" .
General
- Página de inicio de Co-Array Fortran (ya no funciona)
- Comité ISO Fortran
- Comité Fortran ANSI / INCITS
- Videos instructivos sobre CAF en el estándar Fortran por John Reid (consulte el Apéndice B)
- Coarray en GNU Fortran
- CoarrayLib en GNU Fortran
- Biblioteca OpenCoarrays
- Compilador NAG Fortran