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.
- 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.
- 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
- 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)
- 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
- 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:
Solució
Exercici 2: Vectorització
Vectoritza el següent codi:
Solució
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.
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