Warum scheint CudaFree nicht die Erinnerung zu befreien?

8

Ich versuche, Gerätespeicher zuzuordnen, kopiere es, führe die Berechnungen auf der GPU durch, kopiere die Ergebnisse zurück und gebe dann den zugewiesenen Gerätespeicher frei. Ich wollte sicherstellen, dass ich das Limit nicht überschreiten würde und ich wollte sehen, ob ich genug Speicher im gemeinsamen Speicherbereich haben würde, um ein paar Arrays auszugeben.

Wenn ich Gerätespeicher zuordnen, werden keine Fehler zurückgegeben. Wenn ich cudaMemGetInfo verwende, um die Menge des zugewiesenen Speichers zu überprüfen, sieht es so aus, als ob ein cudaMalloc keinen Speicher zugewiesen hat. Auch wenn ich versuche, den Speicher freizugeben, sieht es so aus, als wäre nur ein Zeiger freigegeben.

Ich verwende die Schnittstelle matlab Mexfunction , um den GPU-Speicher einzurichten und den Kernel zu starten. An dieser Stelle rufe ich nicht einmal in den Kernel und gebe nur eine Einheitsmatrix für die Ergebnisse zurück.

%Vor%

Hier ist die Ausgabe von diesem:

%Vor%

Ich habe das Gefühl, dass etwas offensichtlich ist, dass ich vermisse. Kann mir jemand erklären, was vor sich geht?

EDIT: Plattform ist Windows 7 mit einer Tesla C2050 GPU-Karte.

    
Beau Bellamy 01.05.2012, 07:23
quelle

1 Antwort

11

Es ist ein ziemlich häufiges Missverständnis, dass malloc beim Aufruf direkt Speicherzuweisungen vom Host-Betriebssystem erhält, und free gibt sie direkt an den Host zurück, wenn sie aufgerufen werden. Aber fast immer funktionieren sie nicht so, stattdessen verwaltet die Standardbibliothek eine kreisförmige Liste von freiem und mallokalisiertem Speicher, die opportunistisch durch Interaktion mit dem Host-Betriebssystem erweitert und kontrahiert wird (siehe einige Antworten auf Wie funktionieren malloc () und free ()? für mehr Details, wenn Sie interessiert sind). Unabhängig davon, wie es funktioniert, führt dies zu einer Reihe von nicht-intuitiven Ergebnissen, einschließlich der Tatsache, dass es normalerweise unmöglich ist, so viel Speicher zuzuweisen, wie das OS sagt, dass Zuteilungen manchmal die Menge an freiem Speicher nicht ändern, und dass free manchmal keine Auswirkung auf die Menge an Speicher hat, die das OS sagt, dass es frei ist.

Obwohl ich nur empirische Beweise dafür habe, glaube ich, dass CUDA genau so funktioniert. Der Kontext pflegt seine eigene Liste von mallokontiertem und freiem Speicher und erweitert und kontrahiert den Speicher, der in dieser Liste als Host-Treiber / Fenster-Manager gespeichert ist, und die GPU selbst erlaubt dies. Die gesamte Hardware hat eine charakteristische MMU-Seitengröße, und es gibt Hinweise darauf, dass die Seitengröße bei NVIDIA-Grafikprozessoren ziemlich groß ist. Dies bedeutet, dass in cudaMalloc -Aufrufen eine ziemlich grobe Granularität vorliegt und manchmal scheint malloc die Menge an freiem Speicher nicht zu beeinträchtigen oder viel mehr Speicher zu verbrauchen als angefordert wurde, und manchmal scheinen free -Aufrufe keine Wirkung zu haben (Wenn Sie interessiert sind, können Sie ein kleines Tool finden, das das Seitengrößenverhalten des CUDA-Treibers veranschaulicht. hier , obwohl es für eine frühe Version der CUDA-API geschrieben wurde und einige Änderungen benötigen könnte, um mit modernen Versionen zu kompilieren." Ich glaube, das ist die wahrscheinlichste Erklärung für das Verhalten, das Sie beobachten.

Übrigens, wenn ich eine vereinfachte Version des Codes, den Sie auf MacOS 10.6 mit einem Gerät der GT200-Familie gepostet haben, ausführen:

%Vor%

Ich bekomme ein anderes Ergebnis, aber auch eines mit dem gleichen Phänomen:

%Vor%

Dies legt nahe, dass das Verhalten auch von der Hardware / dem Host-Betriebssystem abhängig ist.

    
talonmies 02.05.2012, 07:17
quelle

Tags und Links