2016-03-29 4 views
6

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; 
} 
+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

+1

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

+0

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? –

Antwort

1

Ich bin gerade wieder dazugekommen, dies zu posten, aber das Problem stellte sich heraus, dass ich Kernel.SetArgument() nicht jedesmal aufgerufen habe, wenn ich die Execute() -Methode aufgerufen habe. Ich tat dies ursprünglich, weil ich befürchtete, dass es den Puffer neu kopieren würde, aber wie sich herausstellt, tritt die Pufferkopie bei dieser Methode sowieso nicht auf (daher war der Aufwand sowieso gering).

1

Leider i weniger als 50 rep verursachen nicht kommentieren. aber welches Betriebssystem benutzt du? GPU? Treiber? Ich habe ähnliche Probleme durch opencl.dll verursacht, ich habe win10 und Nvidia (x64) verwendet. Schauen Sie auch auf https://social.technet.microsoft.com/Forums/en-US/85680348-c2c4-40bc-9f39-9dcfeea331c0/windows-10-opencldll-error?forum=win10itprogeneral

Es scheint, dass gibt es ein Problem mit der Speicherkomprimierung in Win10.

Mein Problem wurde durch die Aktualisierung von Win7 auf win10 verursacht, ohne die nvidia-Treiber zu aktualisieren.

+0

Vielen Dank für die Antwort.Ich benutze Win10 und Nvidia X64, aber ich habe auf die neuesten Treiber für alles, was ich denke, aktualisiert? Ich werde jedoch in den Link schauen! – guitar80

0

Zeigt Ihre nvidia-Grafikkarte an? Wenn NVIDIA die Hauptgrafikkarte ist, müssen Sie die Registrierung bearbeiten, um den Watchdog zu deaktivieren.

für windows 7

system/current/control/graphicsdriver 
TdrLevel(DWORL) : 0 
+0

Obwohl dies wahr und eine gute Ressource ist, war es nicht mein spezielles Problem. Das Ändern der SetKernelArgs reparierte es. Ein Teil von mir fragt sich, ob es eine Art Speicherzuordnungsproblem war, aber idk. Ich hatte schon einmal Watchdog-Fehler, aber nicht in diesem speziellen Fall – guitar80