Während ich einige Test-Code in OpenCL (mit Cloo C#), begann ich diese OutOfResource-Fehler von OpenCL bekommen und manchmal Unity stürzt nur vollständig ab, bevor ich eine Ausnahme bekomme. Ich rufe im Grunde eine Kernel-Funktion immer wieder mit einer variierenden Anzahl von globalen/lokalen Workitems auf, um das Timing zu überprüfen. Ich lasse die Argumente gleich und nenne den Kernel beginnend mit 2x2x2 global und 2x2x2 local und iteriere nach oben nur gültige Größen. Es funktioniert gelegentlich, aber die meiste Zeit führt es etwa 30 oder 40 Execute() -Aufrufe aus und stürzt dann beim nächsten Execute() -Aufruf ab.OpenCL Cloo: Out of Resources Fehler
Hinweis: Execute bezieht sich auf die OpenCL.dll auf dem Computer. Die Stack-Trace-Unity-Rückgabe ist NULL, die ich aufgrund des systemeigenen Codes vermute.
Wer hat eine Idee was könnte das verursachen?
Hinweis: Diese Version von Cloo ist Cloo-Unity von GitHub und ich verwende es in Unity. Die entsprechende OpenCL-Funktion, die aufgerufen wird, wenn ich den Fehler erhalte, ist clEnqueueNDRangeKernel(), aber in Cloo heißt sie Execute().
Codebeispiel:
//Setup inputs one time...
foreach (var input in p_inputs)
{
inputs.Add(input.Function, input);
profiles.Add(input.Function, new RunProfile(input.Function, input.Weight));
input.Input.Prepare(package[input.Function]);
}
//Profile...
DateTime start;
int g_state = 0;
int l_state = 0;
long[] g = new long[3] { 2, 2, 2 };
long[] l = new long[3] { 2, 2, 2 };
while(g[0] * g[1] * g[2] < Device.MaxWorkGroupSize)
{
l[0] = 2; l[1] = 2; l[2] = 2; l_state = 0; //Reset locals
bool proceed = true;
while(proceed)
{
proceed = (l[0] != g[0] || l[1] != g[1] || l[2] != g[2]);
if (CLUtilities.ValidateExecutionParameters(Device, g, l))
{
Debug.Log("Profiling Start: " + g.ToEnumeratedString() + "/" + l.ToEnumeratedString());
foreach (var profile in profiles)
{
start = DateTime.Now;
//Exception here when on (g=6x4x4, l=6x4x4)
package.Execute(package[profile.Key], g, l);
package.Commands.Flush();
package.Commands.Finish();
float time = (float)(DateTime.Now - start).TotalMilliseconds;
profile.Value.AddRun(g, l, time);
}
Debug.Log("Profiling Ending: " + g.ToEnumeratedString() + "/" + l.ToEnumeratedString());
}
l[l_state] += 2;
l_state = (l_state == 2) ? 0 : l_state + 1;
}
g[g_state] += 2;
g_state = (g_state == 2) ? 0 : g_state + 1;
}
‚begann es diesen Fehler zu werfen‘ => zumindest den Stack-Trace liefern und wo in Ihrem Codebeispiel geschieht es (dh ich package.Execute annehmen würde, aber wer weiß). – tolanj
Ich werde es bearbeiten, aber das Problem ist, ich kommentieren, dass es bei Ausführen auftritt, jedoch die Stack-Trace Unity-Ausgaben sagt, dass die Stack-Trace war null. (Ich nehme an, weil es in der nativen OpenCL-DLL auftritt – guitar80
Verwendet Einheit andere opencl unter einer Erweiterung als eine Beschleunigung für ... Kollisionen oder die Verwendung von OpenGL, die GPU-Speicher mit Texturen füllt, so dass Sie nicht mehr Speicher haben? –