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

  1. Coarray: Una variable distribuïda que pot ser accedida per múltiples imatges (processos paral·lels).
  2. Imatge: Una instància d'un programa Fortran que pot executar-se en paral·lel amb altres instàncies.
  3. 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.

real, dimension(:)[*] :: A

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:

A(i)[j]

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

  1. Declaració de Coarray: real, dimension(n)[*] :: A declara A com un coarray de n elements distribuït entre totes les imatges.
  2. Inicialització: Cada imatge inicialitza el seu segment de l'array A amb valors de 1 a n.
  3. Suma Local: Cada imatge calcula la suma dels seus elements locals amb local_sum = sum(A(:)).
  4. Suma Global: La subrutina co_sum suma les sumes locals de totes les imatges i emmagatzema el resultat en total_sum.
  5. 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:

  1. Inicialitzar l'array amb valors de 1 a n.
  2. Calcular el producte local de cada segment de l'array.
  3. Combinar els productes locals per obtenir el producte total.
  4. 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ó

  1. Inicialització: Cada imatge inicialitza el seu segment de l'array A amb valors de 1 a n.
  2. Producte Local: Cada imatge calcula el producte dels seus elements locals amb local_product = product(A(:)).
  3. Producte Global: La subrutina co_product combina els productes locals de totes les imatges i emmagatzema el resultat en total_product.
  4. Impressió del Resultat: La imatge 1 imprimeix el resultat final.

Errors Comuns i Consells

  1. No inicialitzar correctament els coarrays: Assegura't que cada imatge inicialitzi correctament els seus segments de coarrays.
  2. Accés incorrecte a coarrays: Utilitza la notació de coarray correcta per accedir a elements en imatges específiques.
  3. 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.

© Copyright 2024. Tots els drets reservats