VRAM-Allocator CUDA Version

HisN

Kokü-Junkie (m/w)
Die Diskussion wie viel VRAM man nun wirklich auf einer Grafikkarte braucht ist so alt wie das Forum, wenn nicht sogar älter :-)

Bis jetzt konnte man die Frage nur schwer beantworten, z.b. indem man "gleiche" Grafikkarten mit unterschiedlicher Speicher-Ausstattung gegeneinander geprüft hat.

Aber damit konnte man nicht "jede" Speichermenge simulieren, und ständig Karten umstecken ist an sich auch nicht der richtige Weg.


Hier kommt der User @gausmath ins Spiel.

Er hat mal schnell ein kleines Programm geschrieben, das über Cuda eine beliebige VRAM-Menge belegt.

Man kann also jetzt den Speicher einer Grafikkarte bewusst "begrenzen" indem man einfach Teile davon füllt.

Und schon kann man ganz genau erkennen ab wann eine Software anfängt an Leistung zu verlieren wenn ihr der Speicher ausgeht.

Und das ohne Karten tauschen zu müssen, einfach mit ein paar Zeilen in der Eingabe-Aufforderung.


Download-Link: https://1drv.ms/u/s!As_jnW8h38YpgcZ0wUsAP7tNmnFf1Q


Aufruf des Tools über die Konsole:

Code:
gpumem.exe 1000


1000 sind 1GB. Quellcode ist auch im Ordner und wird mit

Code:
nvcc gpumem.cu -o gpumem -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin"


kompiliert, falls man das selbst kompilieren möchte. Dazu braucht man noch das CUDA SDK: CUDA Toolkit 10.1 Download | NVIDIA Developer


Hier als Beispiel. Ich habe im Leerlauf gut 1GB VRAM der Graka mit dem Zeug was bei mir so am Desktop läuft durch den Fenstermanager belegt.

leerlauf-jpg.1035862



Ich starte das Programm mit dem Wert 10 GB und es werden 10GB VRAM gefüllt.

vram-gefuellt-jpg.1035861


Und sobald ich Return drücke, geht es auf den alten Wert zurück.

vram-fertig-jpg.1035860


So kann man jede Software dazu zwingen mit dem Speicher jonglieren zu müssen und genau sehen ab wann welche Software bei welchen Settings anfängt zu stottern oder die FPS in den Keller gehen. Und zwar ohne viel Aufwand.

Ich hofffe das hilft bei der Frage: Wie viel VRAM ist wirklich nötig. Auch wenn die Beobachtung zur Zeit tatsächlich nur auf Grafikkarten mit "mehr als Genug" VRAM Punkte bringt, weil man auf Grafikkarten die sowieso schon zu wenig VRAM haben nur den Memorymanager mit Swappen beschäftigt. Wobei man allerdings aus der Beobachtung wie viel nun tatsächlich ins RAM geswappt wird, AUCH seine Schlüsse ziehen kann.


Vielen Dank nochmal an den Programmierer gaussmath.




VRAM.Fertig.jpg VRAM-Gefuellt.jpg Leerlauf.jpg
 
Zuletzt bearbeitet:
Gilt immer noch die 4GB Grenze für OpenCL Applikationen durch den Nvidia Treiber??
 
Nein, ich kann wundervoll 18GB vermüllen. Hier mal mein erster Versuch.

ROTTR in DX11 (Kein Antialiasing/DSR/SSAA) mit VXAO, rest Maxed-Out in FHD.

ROTTR_2019_03_03_16_31_30_317.jpg

Ich starte das Tool

ROTTR_VRAM-Knapp.jpg

Und wir können sehen das 6GB VRAM eventuell nicht mehr der Weißheit letzter Schluss in FHD sein könnten, wenn man dieses Game betrachtet, und man sieht auch sehr genau, woher das System jetzt fehlendes VRAM hernimmt.

ROTTR_2019_03_03_16_34_18_843.jpg

Und schnell noch ein Gegentest mit 10GB "geklautem" Speicher. Nicht das jemand erzählt, das Tool klaut die Leistung.

ROTTR_2019_03_03_16_46_25_605.jpg

Und das beste ES FUNKTIONIERT SOGAR IM CPU-LIMIT
 
Zuletzt bearbeitet:
Gut, wir müssen ja auch die AMDler am Test beteiligen. CUDA läuft auf AMD Karten nicht, aber ich sitze gerade an der OpenCL Variante.

Hier der OpenCL Code:
Code:
#include <stdio.h>
#include <OpenCL/opencl.h>

int main(int argc, char *argv[])
{
     unsigned long long mem_size = 0;
     int err; // error code
     cl_device_id device_id; // compute device id 
     cl_context context; // compute context
     cl_mem devTestMem
     
     err = clGetDeviceIDs(NULL, CL_DEVICE_TYPE_GPU, 1, &device_id, NULL);

     if (err != CL_SUCCESS)
     {
         printf("Error: Failed to create a device group!\n");
         return EXIT_FAILURE;
     }
     
     context = clCreateContext(0, 1, &device_id, NULL, NULL, &err);

     if (!context)
     {
         printf("Error: Failed to create a compute context!\n");
         return EXIT_FAILURE;
     }

     // get amount of memory to allocate in MB, default to 256
     if(argc < 2 || sscanf(argv[1], " %llu", &mem_size) != 1) {
        mem_size = 256;
     }
     mem_size *= 1024*1024;; // convert MB to bytes

     // allocate GPU memory
     devTestMem = clCreateBuffer(context,CL_MEM_READ_WRITE,mem_size,NULL,&err);
     
     if(!devTestMem) {
        printf("Error, could not allocate %llu bytes.\n", mem_size);
        return EXIT_FAILURE;
     }

     // wait for a key press
     printf("Press return to exit...\n");
     getchar();

     // free GPU memory and exit
     clReleaseMemObject(devTempMem);
     clReleaseContext(context);
     return 0;
}

Muss das nur noch kompiliert kriegen.
 
Zuletzt bearbeitet von einem Moderator:
Wozu soll das jetzt nochmal genau gut sein?

Ich mülle meinen VRAM voll, von dem ich eh schon zu wenig habe, egal wieviel ich davon habe, WEIL...?????
 
Hab den Code zum laufen gebracht, allerdings scheint's Probleme bei der Device Identifizierung zu geben.

Ich mache morgen weiter..
 
Nein, ich kann wundervoll 18GB vermüllen. Hier mal mein erster Versuch.

ROTTR in DX11 (Kein Antialiasing/DSR/SSAA) mit VXAO, rest Maxed-Out in FHD.







Und wir können sehen das 6GB VRAM eventuell nicht mehr der Weißheit letzter Schluss in FHD sein könnten, wenn man dieses Game betrachtet, und man sieht auch sehr genau, woher das System jetzt fehlendes VRAM hernimmt.

rottr_2019_03_03_16_34_18_843-jpg.1035877

Bei deinem Bild fragt man sich halt nur warum und vor allem weshalb wird soviel VRam verbraucht. Auch mit 6GB VRam kann ich ein gutes Bild in 4K zaubern ohne Texturmatsch.
Wer mit 6GB VRam in FHD nicht auskommt, macht was falsch. Keiner zwingt einen Texturmods oder 4K Texturen in FHD einzuschalten.
Für den der das will.....kein Ding wenn er eine Grafikkarte mit viiieeelll VRam kauft. .

GTX 980 Ti 6GB VRam und es ruckelt und matscht nicht:D
 

Anhänge

  • ROTTR_2016_09_24_12_50_36_374.jpg
    ROTTR_2016_09_24_12_50_36_374.jpg
    2,1 MB · Aufrufe: 104
  • ROTTR_2016_09_24_12_53_30_872.jpg
    ROTTR_2016_09_24_12_53_30_872.jpg
    2,1 MB · Aufrufe: 100
Genau darauf will ich hinaus.
Man kann jetzt ganz genau sehen ab wann eine bestimmte Menge VRAM Leistung kostet.
Und es gibt halt die Gamer die jedem FPS hinterherrennen, und die Gamer die einfach nur zocken wollen, und die Gamer, bei denen das Bild einfach nicht geil genug aussehen kann.
Jeder dieser Gruppe kann man jetzt bei einer Kaufberatung eventuell besser helfen wie viel Geld sie in VRAM stecken sollen.

Die Sache ist doch die ... VRAM kostet Geld, daher gibt es die "preiswerten" Grafikkarten mit weniger VRAM. Nun kann man losgelöst von der Rohleistung schon mal Betrachten wie viel VRAM man für eine bestimmte Anwendung braucht.
Denn viele Leute kaufen ihre Grafikkarten ja z.b. wenn sie für eine Bestimmte Anwendung nicht mehr ausreichen.
Ich beobachte das mit dem VRAM ja schon etliche Jahre, konnte aber bissher nur sehen wie viel VRAM eine Anwendung belegt, nicht wie viel sie benötigt.
DAS sehe ich jetzt besser als vorher. Ich finde das unglaublich interessant.
 
Zuletzt bearbeitet:
Und es gibt halt die Gamer die jedem FPS hinterherrennen, und die Gamer die einfach nur zocken wollen, und die Gamer, bei denen das Bild einfach nicht geil genug aussehen kann.
Jeder dieser Gruppe kann man jetzt bei einer Kaufberatung eventuell besser helfen wie viel Geld sie in VRAM stecken sollen.

Wenn es in einer Kaufberatung auch so ablaufen würde wäre wirklich viel gewonnen. Falsch ist es sicher nicht, wenn man sich damit auch auseinandersetzt.
 
Es wird bei vielen Spielen immer noch ein Unterschied sein ob wirklich "nur" 4GB VRam vorhanden sind oder ob von 8GB VRam 4GB belegt sind.
Das "VRam Management" wird idR zu beginn durch die tatsätzlich vorhande VRam Menge gewählt, mit der Erwartung, der Treiber/das System verschaft der Anwendung/Game eben nahezu 100% des VRams.
 
Ich denke, dass Speicherallokierung heutzutage ziemlich dynamisch ist. Das Game kann schlecht erwarten, dass es die einzige Applikation Ist, die VRAM benötigt.
 
Doch, die überwiegende Mehrheit der Games wird genau davon ausgehen. GPU hat 8GB VRam verbaut, also nutze ich die auch, die anderen müssen platz machen, was idR mit OpenCL/CUDA Code eher nicht passieren wird (was ja eigentlich von dir gewollt ist!).
Ich kenne KEINE Game Engine die es anders macht. Es wird genau einmal abgefragt wieviel VRam "VERBAUT" ist und genau nach diesem Egebniss wird der "VRam Management"/Streaming Algorithmus gewählt. Da aber OpenCL/CUDA Code idR nicht vom System/Treiber Entfernt wird, wird es ein ganz anderes Spielgefühl sein als mit einer "echten" 4GB Karte.
 
Zuletzt bearbeitet:
Schau dir doch mal die Unreal/Unity Engine an.
Wie verhalten sich denn Spiele bei einem 2 Monitor System wenn auf einem ein Spiel gespielt wird wärend auf dem anderm Monitor zb ein Browser ein 4GB Bild/Texture anzeigt?
Oder warum AMD mit HBCC kommt? Genau: Weil gerade Spiele heute noch davon ausgehen, dass der VRam für sie alleine ist.
 
Mit CUDA was Lauffähiges in 10 Minuten. OpenCL: 2 Tage und immer noch kein Land in Sicht... ^^

"clCreateCommandQueue" wurde als veraltet deklariert... :lol:
 
Wilkommen bei OpenCL2.0, solltest du noch ein "älteres" Target brauchen:

#define CL_USE_DEPRECATED_OPENCL_1_2_APIS
#include <CL/cl.h>

;)
 
@openSUSE: Kennst du dich mit OCL aus? Ich poste morgen mal meinen Code...
 
Zurück