Ich habe eine Klasse, die ich eine globale Variable zu instanziiert verwenden:Wie behandeln cudaFree auf global instanziiert Variablen
class BitUnpackPtrs
{
public:
ushort* d_dataIn;
BitUnpackPtrs() : d_dataIn(NULL) {};
~BitUnpackPtrs()
{
cudaFree(d_dataIn);
}
void update(...) { ... }
};
Die Klasse instanziiert wird global als Griff häufige Vergabe von CUDA-Speicher zu reduzieren. Wenn jedoch mein Programm beendet, CUDA-memcheck erzeugt eine Warnung:
Programm cudaErrorCudartUnloading getroffen (Fehler 29) aufgrund "Treiber heruntergefahren" auf CUDA-API-Aufruf zu cudaFree.
Was ist der richtige Weg, damit umzugehen? Ich könnte das cudaFree entfernen, aber wenn diese Klasse zu einem späteren Zeitpunkt auf einer nicht-globalen Ebene verwendet wird, würde dies zu einem Speicherverlust führen. Ich könnte ein Flag im Konstruktor verwenden, um anzugeben, wie der Speicher behandelt werden soll.
Alternativ gibt es eine Möglichkeit zu erkennen, ob der Cuda-Treiber heruntergefahren ist und cudaFree in diesem Fall nicht aufrufen?
Instanziieren Sie keine globalen Objekte von Klassen, die Cuda-Laufzeit-API-Funktionen im Konstruktor oder Destruktor aufrufen oder aufrufen müssen. Die CUDA-Runtime-Initialisierung/Teardown kann sowohl beim Programmstart als auch beim Herunterfahren Probleme verursachen, je nachdem, was genau Sie im Klassenkonstruktor und Destruktor tun. Es gibt keine Möglichkeit zu erkennen, ob der cuda-Treiber heruntergefahren ist (auf eine Weise, die nicht in cuda-memcheck markiert ist) und nicht "cudaFree" in dieser Instanz aufzurufen. –