cudaDeviceReset für mehrere gpu ' s
Ich arbeite derzeit an einem gpu-server mit 4 Tesla T10 gpu ist. Während ich weiter testen, der Kernel und oft töten die Prozesse mit Strg-C), habe ich ein paar Zeilen an das Ende der ein einfaches Gerät-Abfrage-code. Der code ist unten angegeben :
#include <stdio.h>
//Print device properties
void printDevProp(cudaDeviceProp devProp)
{
printf("Major revision number: %d\n", devProp.major);
printf("Minor revision number: %d\n", devProp.minor);
printf("Name: %s\n", devProp.name);
printf("Total global memory: %u\n", devProp.totalGlobalMem);
printf("Total shared memory per block: %u\n", devProp.sharedMemPerBlock);
printf("Total registers per block: %d\n", devProp.regsPerBlock);
printf("Warp size: %d\n", devProp.warpSize);
printf("Maximum memory pitch: %u\n", devProp.memPitch);
printf("Maximum threads per block: %d\n", devProp.maxThreadsPerBlock);
for (int i = 0; i < 3; ++i)
printf("Maximum dimension %d of block: %d\n", i, devProp.maxThreadsDim[i]);
for (int i = 0; i < 3; ++i)
printf("Maximum dimension %d of grid: %d\n", i, devProp.maxGridSize[i]);
printf("Clock rate: %d\n", devProp.clockRate);
printf("Total constant memory: %u\n", devProp.totalConstMem);
printf("Texture alignment: %u\n", devProp.textureAlignment);
printf("Concurrent copy and execution: %s\n", (devProp.deviceOverlap ? "Yes" : "No"));
printf("Number of multiprocessors: %d\n", devProp.multiProcessorCount);
printf("Kernel execution timeout: %s\n", (devProp.kernelExecTimeoutEnabled ? "Yes" : "No"));
return;
}
int main()
{
//Number of CUDA devices
int devCount;
cudaGetDeviceCount(&devCount);
printf("CUDA Device Query...\n");
printf("There are %d CUDA devices.\n", devCount);
//Iterate through devices
for (int i = 0; i < devCount; ++i)
{
//Get device properties
printf("\nCUDA Device #%d\n", i);
cudaDeviceProp devProp;
cudaGetDeviceProperties(&devProp, i);
printDevProp(devProp);
}
printf("\nPress any key to exit...");
char c;
scanf("%c", &c);
**for (int i = 0; i < devCount; i++) {
cudaSetDevice(i);
cudaDeviceReset();
}**
return 0;
}
Meine Anfrage ist im Zusammenhang mit der for-Schleife vor dem main() endet, in der ich jedes Gerät einzeln aus, und verwenden Sie dann cudaResetDevice Befehl. Ich bekomme ein komisches Gefühl, dass dieser code, obwohl nicht produzieren keine Fehler, aber ich bin nicht in der Lage zurücksetzen, um alle Geräte. Anstatt, das Programm setzt nur das Standard-Gerät, das ich.e-Gerät 0 und das jedes mal. Kann mir jemand sagen, was sollte ich tun, um die reset-jedes der 4 Geräte.
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist wahrscheinlich zu spät, aber wenn Sie schreiben, eine signal-handler-Funktion, Sie können loszuwerden, die memory-leaks und setzen Sie das Gerät in einem sicheren Weg:
....
Wenn Sie diesen code verwenden (Sie können auch den ersten Schnipsel in eine externe header, funktioniert es. Sie können 2 Ebenen der Steuerung von Strg+c: das erste drücken Stoppt die simulation und wird normalerweise beendet, aber die Anwendung beendet wird die rendering-Schritt ist ideal, um zu stoppen anmutig und haben korrekte Ergebnisse, wenn Sie drücken Sie Strg+c erneut, schließt es die Anwendung, die Befreiung aller Speicher.
Sieht es aus wie Sie können hinzufügen, eine Funktion auf die GPU-Programme Sie zu fangen, Strg+c signal (SIGINT) und rufen Sie die cudaDeviceReset () - Funktion für jedes Gerät, das verwendet wurde, durch das Programm.
Den Beispiel-code, um eine Funktion aufzurufen, wenn SIGINT gefangen ist, kann hier gefunden werden:
https://stackoverflow.com/a/482725
Es scheint wie eine gute Praxis, die code enthalten, wie dies für jede GPU-Programm, das Sie schreiben, und ich werde das gleiche tun 🙂
Ich habe keine Zeit zu schreiben, bis eine vollständige ausführliche Antwort, also lies die anderen Antworten und die Kommentare auch.
cudaDeviceReset
ist bestimmt für die Vernichtung von Ressourcen im Zusammenhang mit einer bestimmten GPU-Kontext, in dem Prozess, in dem es ausgeführt wird. Eine CUDA-Prozess kann nicht zurückgesetzt oder anderweitig Effekt, den Kontext eines anderen Prozesses. Also, wenn Sie Ihr Gerät geändert Abfrage ruftcudaDeviceReset
ist es nur releases Ressourcen, die Sie zugeordnet sind, nicht in Nutzung durch einen anderen Prozess.