2010-10-21 3 views
5

Es scheint wie 2 Millionen Floats sollte keine große Sache sein, nur 8 MBs 1 GB GPU RAM. Ich bin in der Lage, zu viel Zeit und manchmal mehr als das ohne Probleme zuzuteilen. Ich bekomme CL_OUT_OF_RESOURCES, wenn ich einen clEnqueueReadBuffer mache, was merkwürdig erscheint. Kann ich herausfinden, wo der Ärger wirklich begonnen hat? OpenCL sollte nicht so bei CLEnqueueReadBuffer richtig ausfallen? Es sollte sein, wenn ich die Daten richtig verteilt habe? Gibt es eine Möglichkeit, mehr Details als nur den Fehlercode zu erhalten? Es wäre cool, wenn ich sehen könnte, wie viel VRAM zugewiesen wurde, als OpenCL CL_OUT_OF_RESOURCES deklarierte.CL_OUT_OF_RESOURCES für 2 Millionen schwebt mit 1GB VRAM?

Antwort

3

Nicht jeder verfügbare Speicher kann notwendigerweise einer einzigen Erfassungsanforderung zugeführt werden. Lesen Sie weiter auf Heapfragmentierung 1, 2, 3, um mehr darüber zu erfahren, warum die größte Zuweisung, die erfolgreich sein kann, für den größten zusammenhängenden Speicherblock ist und wie Blöcke in kleinere Stücke als Ergebnis der Verwendung des Speichers aufgeteilt werden.

Es ist nicht, dass die Ressource erschöpft ist ... Es kann einfach nicht ein einziges Stück groß genug finden Sie Ihre Anforderung zu erfüllen ...

+0

Das macht Sinn, danke für den Hinweis. Gibt es eine Möglichkeit zu analysieren, wie die Fragmentierung des Heapspeichers auf der GPU aussieht, wenn der Fehler aufgetreten ist? – smuggledPancakes

+0

Vielleicht gDEBbugger? http://www.gremedy.com/ Ich habe es nie benutzt. –

+0

Irgendwie bezweifle ich, dass das wirklich das Problem ist, da der GPU-Speicher im Allgemeinen nicht genug dafür fragmentiert sein sollte. Afterall 8MB ist nicht wirklich so viel auf einer 1GB-Karte (zumal der Treiber in der Lage sein sollte, aktuell ungenutzten Speicher zum Hauptspeicher zu ziehen) und Zuweisungen von GPU-Speicher sind typischerweise relativ klobig. Es scheint also wahrscheinlich, dass Sie nahe am Speicherlimit sein müssen, wenn Sie solche Probleme aufgrund von Fragmentierung sowieso sehen und wenn es ein normales Grafikkartensystem ist (im Gegensatz zu zB Tesla), bezweifle ich, dass der Fahrer zu diesem Zeitpunkt nicht eingreifen würde einige Kontexte). – Grizzly

5

Von another source:

- Aufruf clFinish() bekommt man den Fehler Status für die Berechnung (anstatt es zu bekommen, wenn Sie versuchen, Daten zu lesen).
- Der Fehler "out of resources" kann auch durch ein Timeout von 5s verursacht werden, wenn die (NVidia) Karte auch als Anzeige verwendet wird
- es kann auch erscheinen, wenn Sie Zeigerfehler in Ihrem Kernel haben.

Ein Follow-up schlägt den Kernel läuft zunächst auf der CPU machen Sie nicht out-of-bounds, um sicherzustellen, Speicherzugriffe.

7

Ich hatte gerade das gleiche Problem, das Sie hatten (nahm mich einen ganzen Tag zu beheben). Ich bin sicher, dass Leute mit dem gleichen Problem darüber stolpern werden, deshalb poste ich diese alte Frage.

Sie haben wahrscheinlich nicht nach der maximalen Arbeitsgruppengröße des Kerns gesucht.

Dies ist, wie Sie es tun:

size_t kernel_work_group_size; 
clGetKernelWorkGroupInfo(kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(size_t), &kernel_work_group_size, NULL); 

Meine Geräte (2x NVIDIA GTX 460 & Intel i7 CPU) eine maximale Arbeitsgruppengröße von 1024 unterstützen, aber die obige Code gibt 500 etwas um, wenn ich pass Mein Pfadverfolgungskernel. Als ich eine Arbeitsgruppengröße von 1024 verwendete, ist es offensichtlich fehlgeschlagen und hat mir den CL_OUT_OF_RESOURCES Fehler gegeben.

Je komplexer Ihr Kernel wird, desto kleiner wird die maximale Größe der Arbeitsgruppe für ihn (oder zumindest das, was ich erlebt habe).

Edit:
ich Sie gerade gesagt haben realisiert "clEnqueueReadBuffer" statt "clEnqueueNDRangeKernel" ...
Meine Antwort wurde auf clEnqueueNDRangeKernel bezogen.
Entschuldigung für den Fehler.
Ich hoffe, dass dies noch für andere Menschen nützlich ist.

+0

Hey danke. Sie haben Recht! Ich habe die maximale Arbeitsgruppensumme des Geräts anstelle der maximalen Arbeitsgruppegröße des Kernels verwendet. Geändert, dass es behoben :). – Gamer

+0

Kein Problem. Es freut mich, dass ich helfen konnte. : D – Tara

+1

Hatte das gleiche Problem, thx! –

1

Außerhalb der Grenzen sind acesses in einem Kernel in der Regel still (da beim Kernelwarteschlangenaufruf immer noch kein Fehler vorliegt).

Wenn Sie jedoch versuchen, das Kernel-Ergebnis später mit einem clEnqueueReadBuffer() zu lesen. Dieser Fehler wird angezeigt. Es zeigt an, dass bei der Ausführung des Kernels etwas schief gelaufen ist.

Überprüfen Sie Ihren Kernel-Code auf Out-of-Bounds Lesen/Schreiben.

Verwandte Themen