CL_OUT_OF_RESOURCES für 2 Millionen schwimmt mit 1GB VRAM?
Wie es scheint, 2 Millionen schwimmt sollte keine große Sache sein, nur 8MBs von 1 GB GPU-RAM. Ich bin in der Lage zu reservieren, dass viel manchmal und manchmal mehr als das, keine Probleme. Ich bekomme CL_OUT_OF_RESOURCES wenn ich eine clEnqueueReadBuffer, das scheint seltsam. Bin ich in der Lage zu erschnüffeln, wo die Probleme wirklich begonnen? OpenCL sollte nicht so Versagen bei clEnqueueReadBuffer Recht? Es sollte, wenn ich die Daten richtig zugeordnet? Gibt es eine Möglichkeit, um mehr details zu bekommen, als nur den Fehlercode? Es wäre cool, wenn ich sehen konnte, wie viel VRAM zugewiesen wurde, wenn OpenCL erklärt CL_OUT_OF_RESOURCES.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht den gesamten verfügbaren Arbeitsspeicher kann unbedingt geliefert werden, um eine einzelne Akquisition Anfrage. Lesen Sie die heap-Fragmentierung Eins, Zwei, Drei zu lernen mehr über, warum die größte Zuteilung, die gelingen kann, ist für den größten zusammenhängenden block von Speicher und wie Blöcke geteilt in kleinere Teile, die als ein Ergebnis der Verwendung der Speicher.
Es ist nicht so, dass die Ressource erschöpft ist... Es ist einfach nicht finden können, ein Stück groß genug, um zu befriedigen Ihre Anfrage...
Ich hatte gerade das gleiche problem hatte (hat mich einen ganzen Tag zu reparieren).
Ich bin mir sicher, dass Leute mit dem gleichen problem stolpern, deshalb bin ich Entsendung zu dieser alten Frage.
Du vermutlich nicht überprüfen, für die maximale Arbeit, die Größe der Gruppe der kernel.
Dies ist, wie Sie es tun:
Meine Geräte (2x NVIDIA GTX 460 & Intel i7 CPU) Unterstützung für eine maximale work group size von 1024, aber der obige code gibt irgendwas um die 500, wenn ich an meinem Path Tracing kernel.
Wenn ich in einem workgroup-Größe von 1024 es offenbar nicht und gab mir die CL_OUT_OF_RESOURCES Fehler.
Je komplexer dein kernel wird, desto kleiner ist die maximale workgroup-Größe wird es werden (oder zumindest, was ich erlebt habe).
Edit:
Ich habe gerade realisiert, Sie sagte "clEnqueueReadBuffer" statt "clEnqueueNDRangeKernel"...
Meine Antwort bezog sich auf die clEnqueueNDRangeKernel.
Sorry für die Fehler.
Ich hoffe, dies ist immer noch nützlich für andere Menschen.
Vom eine andere Quelle:
Follow-up schlägt vor, läuft der kernel zuerst auf der CPU, um sicherzustellen, Sie sind nicht so out-of-bounds Speicher zugreift.
Out-of-bounds Zugriffe im kernel sind in der Regel leise (da ist noch kein Fehler bei der kernel-queueing-call).
Jedoch, wenn Sie versuchen, um den kernel Ergebnis später mit einem clEnqueueReadBuffer(). Dieser Fehler wird angezeigt. Es gibt etwas schief, während der kernel-Ausführung.
Überprüfen Sie Ihre kernel-code für die out-of-bounds read/schreibt.