Introducció
La programació paral·lela és una tècnica que permet executar múltiples càlculs simultàniament, aprofitant així els recursos de maquinari moderns com els processadors multicore. Fortran, amb la seva llarga història en el càlcul científic i d'enginyeria, ha incorporat característiques per a la programació paral·lela, una de les quals és l'ús de coarrays.
Els coarrays són una extensió del llenguatge Fortran que permeten la programació paral·lela de manera més natural i integrada. En aquest mòdul, aprendrem què són els coarrays, com es declaren i utilitzen, i veurem exemples pràctics de la seva aplicació.
Conceptes Clau
- Coarray: Una variable distribuïda que pot ser accedida per múltiples imatges (processos paral·lels).
- Imatge: Una instància d'un programa Fortran que pot executar-se en paral·lel amb altres instàncies.
- Sintaxi de Coarray: La manera en què es declaren i accedeixen els coarrays en Fortran.
Declaració de Coarrays
Els coarrays es declaren afegint una especificació de coarray a la declaració de la variable. Aquesta especificació indica la distribució de la variable entre les imatges.
En aquest exemple, A
és un coarray de tipus real
distribuït entre totes les imatges disponibles.
Accés a Coarrays
Per accedir a elements d'un coarray en una imatge específica, utilitzem la notació de coarray. Per exemple, per accedir a l'element i
del coarray A
en la imatge j
, escriurem:
Exemple Pràctic
A continuació, veurem un exemple pràctic d'ús de coarrays per sumar elements d'un array en paral·lel.
Codi
program parallel_sum implicit none integer, parameter :: n = 100 real, dimension(n)[*] :: A real :: local_sum, total_sum integer :: i ! Inicialitzar l'array A amb valors do i = 1, n A(i) = i end do ! Calcular la suma local local_sum = sum(A(:)) ! Sumar les sumes locals de totes les imatges call co_sum(local_sum, total_sum) ! Imprimir el resultat des de la imatge 1 if (this_image() == 1) then print *, 'La suma total és: ', total_sum end if end program parallel_sum
Explicació del Codi
- Declaració de Coarray:
real, dimension(n)[*] :: A
declaraA
com un coarray den
elements distribuït entre totes les imatges. - Inicialització: Cada imatge inicialitza el seu segment de l'array
A
amb valors de1
an
. - Suma Local: Cada imatge calcula la suma dels seus elements locals amb
local_sum = sum(A(:))
. - Suma Global: La subrutina
co_sum
suma les sumes locals de totes les imatges i emmagatzema el resultat entotal_sum
. - Impressió del Resultat: La imatge 1 imprimeix el resultat final.
Exercici Pràctic
Enunciat
Escriu un programa en Fortran que utilitzi coarrays per calcular el producte de tots els elements d'un array distribuït entre múltiples imatges. El programa ha de:
- Inicialitzar l'array amb valors de
1
an
. - Calcular el producte local de cada segment de l'array.
- Combinar els productes locals per obtenir el producte total.
- Imprimir el resultat des de la imatge 1.
Solució
program parallel_product implicit none integer, parameter :: n = 100 real, dimension(n)[*] :: A real :: local_product, total_product integer :: i ! Inicialitzar l'array A amb valors do i = 1, n A(i) = i end do ! Calcular el producte local local_product = product(A(:)) ! Combinar els productes locals de totes les imatges call co_product(local_product, total_product) ! Imprimir el resultat des de la imatge 1 if (this_image() == 1) then print *, 'El producte total és: ', total_product end if end program parallel_product
Explicació de la Solució
- Inicialització: Cada imatge inicialitza el seu segment de l'array
A
amb valors de1
an
. - Producte Local: Cada imatge calcula el producte dels seus elements locals amb
local_product = product(A(:))
. - Producte Global: La subrutina
co_product
combina els productes locals de totes les imatges i emmagatzema el resultat entotal_product
. - Impressió del Resultat: La imatge 1 imprimeix el resultat final.
Errors Comuns i Consells
- No inicialitzar correctament els coarrays: Assegura't que cada imatge inicialitzi correctament els seus segments de coarrays.
- Accés incorrecte a coarrays: Utilitza la notació de coarray correcta per accedir a elements en imatges específiques.
- Sincronització: Utilitza subrutines de sincronització com
sync all
per assegurar que totes les imatges han completat les seves operacions abans de combinar resultats.
Conclusió
Els coarrays en Fortran proporcionen una manera poderosa i eficient de programar aplicacions paral·leles. Amb una comprensió clara de la seva sintaxi i ús, pots aprofitar els recursos de maquinari moderns per millorar el rendiment dels teus programes. En el següent mòdul, explorarem altres tècniques avançades de Fortran per optimitzar i mantenir el teu codi.
Curs de Programació en Fortran
Mòdul 1: Introducció a Fortran
- Introducció a Fortran
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsiques
- Escrivint el teu Primer Programa en Fortran
Mòdul 2: Conceptes Bàsics
- Variables i Tipus de Dades
- Operadors i Expressions
- Entrada i Sortida
- Estructures de Control: Sentències If
- Estructures de Control: Bucles
Mòdul 3: Arrays i Cadenes
Mòdul 4: Procediments i Funcions
Mòdul 5: Estructures de Dades Avançades
Mòdul 6: Gestió de Fitxers
Mòdul 7: Temes Avançats
Mòdul 8: Millors Pràctiques i Optimització
- Tècniques d'Optimització de Codi
- Depuració i Perfilat
- Escrivint Codi Mantenible
- Estàndards i Portabilitat de Fortran