Fortran: dynamische Arrays vs. automatisches Array Speicherzuweisung vermeiden

8

Wenn wir einen unserer Fortran-Codes erstellen, gibt es zwei Subroutinen, die den größten Teil der Rechenzeit beanspruchen (22,1% und 17,2%). In jeder Routine wird ~ 5% der Zeit damit verbracht, Speicher zuzuweisen und freizugeben. Diese Routinen sehen wie

aus %Vor%

Diese Subroutinen werden in der Größenordnung von ~ 4000-5000 mal in meinem Benchmark aufgerufen, also würde ich gerne ALLOCATE und DEALLOCATE loswerden. Wenn Sie diese in automatische Arrays ändern, ändert sich die Profilerausgabe in.

%Vor%

Ändert das resultierende Profil in

%Vor%

Ich sehe aus, als ob gfortran diese auf dem Stack und nicht diesem Heap alloziert, aber ich bin besorgt darüber, wann es passiert, wenn diese Arrays zu groß werden.

Der zweite Ansatz besteht darin, diese Arrays einmal zuzuweisen und zu entfernen.

work_array.f

%Vor%

Ich weise diese einmal in einem anderen Teil des Codes zu. Jetzt sieht mein Unterprogramm wie

aus %Vor%

Aber wenn ich den Code jetzt ausführe, wird das Profil schlechter.

%Vor%

Wo sind diese zusätzlichen mallocs, und Frees kommen von? Wie kann ich dies einrichten, damit ich diese Arrays einmal zuordnen?

    
user1139069 26.06.2012, 18:46
quelle

2 Antworten

4

Da das Array work nur in der Unterroutine bar verwendet wird, können Sie das Attribut save hinzufügen und es beim ersten Aufruf der Subroutine zuweisen. Wenn work1 oder work2 sich von vorherigen Aufrufen unterscheidet, können Sie das Array in diesem Fall einfach neu zuweisen.

Dadurch bleibt das Problem der Aufhebung der Zuordnung bestehen, sobald das Unterprogramm nicht mehr benötigt wird. Wenn Sie es während der gesamten Laufzeit des Programms aufrufen müssen, ist dies kein Problem, da das Betriebssystem den Speicher beim Beenden des Programms freigeben sollte. Auf der anderen Seite, wenn Sie es nur während der Initialisierung benötigen, bleibt der Speicher reserviert, auch wenn er nicht benötigt wird. Vielleicht können Sie der Unterroutine ein Argument hinzufügen, das sie anweist, das work -Array aufzuheben, wenn die Speicherbelegung ein Problem darstellt.

    
pafcu 27.06.2012 06:19
quelle
0

Wenn Sie bei der Programminitialisierung mit einer einzigen Zuweisung zurechtkommen, gibt es keinen Grund, das Array als zuweisbar zu definieren. Setzen Sie es in eine gemeinsame.

Wenn Sie nur eine feste Größe benötigen, aber diese Größe erst zur Laufzeit kennen, müssen Sie mit Ihrer letzten Option, einer einzelnen Zuweisung bei der Initialisierung, fortfahren. Es macht jedoch keinen Sinn, dass dies den Treffer bei der Allokationsleistung erhöht hat. Ich müsste die Definition und den Zuordnungscode sehen, um mehr zu sagen.

Da der virtuelle Speicher reserviert ist, ist die "Speichernutzung" kein wirkliches Problem, es sei denn, das Array ist so groß, dass es den verfügbaren Adressraum beeinflusst.

    
Jerome 08.07.2012 00:11
quelle

Tags und Links