En aquest tema, explorarem diverses tècniques per optimitzar el codi Fortran. L'objectiu és millorar l'eficiència i el rendiment del codi, reduint el temps d'execució i l'ús de recursos. Aquestes tècniques són útils tant per a programes petits com per a aplicacions grans i complexes.

  1. Introducció a l'Optimització de Codi

Conceptes Clau

  • Optimització del Compilador: Utilització de les opcions del compilador per millorar el rendiment del codi.
  • Optimització Manual: Modificació del codi per fer-lo més eficient.
  • Perfilat: Identificació de les parts del codi que consumeixen més temps o recursos.

  1. Optimització del Compilador

Opcions del Compilador

Els compiladors Fortran ofereixen diverses opcions per optimitzar el codi. Algunes de les més comunes són:

  • -O1, -O2, -O3: Nivells d'optimització que el compilador pot aplicar. A mesura que augmenta el nivell, el compilador aplica tècniques més agressives.
  • -funroll-loops: Desenrotlla bucles per reduir la sobrecàrrega de control de bucles.
  • -march=native: Optimitza el codi per a l'arquitectura específica de la màquina on s'està compilant.

Exemple

! Compilació amb optimització
gfortran -O3 -funroll-loops -march=native programa.f90 -o programa_optimitzat

  1. Optimització Manual

Evitar Càlculs Innecessaris

Evitar càlculs repetitius dins de bucles o funcions.

Exemple

! Codi no optimitzat
do i = 1, n
    result = result + sin(x) * cos(y)
end do

! Codi optimitzat
sin_x = sin(x)
cos_y = cos(y)
do i = 1, n
    result = result + sin_x * cos_y
end do

Utilitzar Arrays de Manera Eficient

Accedir als elements dels arrays de manera seqüencial per aprofitar la localitat de memòria.

Exemple

! Codi no optimitzat
do j = 1, n
    do i = 1, m
        a(i, j) = a(i, j) + b(i, j)
    end do
end do

! Codi optimitzat
do i = 1, m
    do j = 1, n
        a(i, j) = a(i, j) + b(i, j)
    end do
end do

Vectorització

Utilitzar operacions vectorials per processar múltiples elements d'un array simultàniament.

Exemple

! Codi no vectoritzat
do i = 1, n
    a(i) = b(i) + c(i)
end do

! Codi vectoritzat
a(1:n) = b(1:n) + c(1:n)

  1. Perfilat

Identificació de Colls d'Ampolla

Utilitzar eines de perfilat per identificar les parts del codi que consumeixen més temps o recursos.

Eines de Perfilat

  • gprof: Eina de perfilat per a programes compilats amb GCC.
  • valgrind: Eina per detectar errors de memòria i analitzar el rendiment.

Exemple d'Ús de gprof

! Compilar amb suport per a perfilat
gfortran -pg programa.f90 -o programa

! Executar el programa
./programa

! Generar el perfil
gprof programa gmon.out > perfil.txt

  1. Consells Addicionals

Evitar l'ús Excessiu de Funcions Intrínseques

Les funcions intrínseques poden ser costoses en termes de temps d'execució. Utilitzar-les amb moderació.

Utilitzar Tipus de Dades Adequats

Seleccionar el tipus de dades més adequat per a cada variable pot millorar l'eficiència del codi.

Paral·lelització

Utilitzar tècniques de paral·lelització, com OpenMP o MPI, per aprofitar múltiples nuclis de processador.

Exercicis Pràctics

Exercici 1: Optimització de Bucles

Optimitza el següent codi per millorar el seu rendiment:

do i = 1, n
    do j = 1, m
        a(i, j) = a(i, j) + b(i, j)
    end do
end do

Solució

do j = 1, m
    do i = 1, n
        a(i, j) = a(i, j) + b(i, j)
    end do
end do

Exercici 2: Vectorització

Vectoritza el següent codi:

do i = 1, n
    a(i) = b(i) + c(i)
end do

Solució

a(1:n) = b(1:n) + c(1:n)

Conclusió

En aquesta secció, hem explorat diverses tècniques per optimitzar el codi Fortran, incloent l'ús d'opcions del compilador, optimització manual, vectorització i perfilat. Aplicar aquestes tècniques pot millorar significativament el rendiment del teu codi. En el proper tema, ens centrarem en tècniques de depuració i perfilat per identificar i corregir errors en el codi.

© Copyright 2024. Tots els drets reservats