Bonjour,
Je travaille pour mon projet de fin d'études sur l'écriture d'un code éléments finis en Fortran.
Le code marche et est efficace pour de petits systèmes, mais dès que le nombre de nœuds augmente c'est la catastrophe au niveau gestion mémoire. J'ai fait pas mal de recherches mais je commence à m'y perdre entre mémoire virtuelle, pile, tas, etc. Bien que je comprenne à peu près les concepts en eux-mêmes, je ne sais plus sur quoi agir pour accélérer la vitesse d'exécution de mon code.
Prenons des matrices 10 000 x 10 000.
Problèmes :
- malgré une grosse RAM (16 Go) disponible, Windows XP(64) swape systématiquement sur disque sans utiliser toute la RAM. Comment l'éviter ?
- la machine possède plusieurs processeurs multicoeurs, mais seul l'un d'entre eux est utilisé. J'ai tenté une parallélisation en OpenMP, tous les coeurs sont sollicités mais la vitesse d'exécution ne s'en trouve pas améliorée, au contraire. J'envisage différentes explications: 1. je me suis planté quelque part en parallélisant, ce qui est fort possible ; ou 2. les piles de chaque thread contiennent des copies de mes variables, ce qui augmente le swap et donc ralentit l'exécution. Est-ce possible ? Avez-vous d'autres suggestions ?
A noter que j'ai augmenté la taille de la pile pour le programme (pas pour chaque thread car je n'ai pas trouvé comment faire).
En résumé, je ne sais plus comment gérer ces "grosses" matrices.. Quelqu'un aurait une idée ?
Merci d'avance !
Partager