Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Mai 14, 2024 07:19

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: OpenCL Problem
BeitragVerfasst: Di Jul 09, 2013 13:10 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Nov 30, 2011 21:41
Beiträge: 136
Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
Hallo allerseits,

Um es mal aus zu probieren, hab ich mir mal openCL angeschaut ( Ich benutze folgenden Header für Delphi: http://code.google.com/p/delphi-opencl/). Ich probiere daran schon ne weile rum komme aber nicht weiter:
Ich hab mir den Log angeschaut und der sagt, dass der Fehler in clBuildProgram ist, also vermutlich in meinem Kernel. Da ich noch keinerlei Erfahrung habe, bräuchte ich eure Hilfe mal wieder dabei (ich hoffe ihr kennt euch damit ein bisschen aus ;) ):

Code:
  1. __kernel void dccollide(__global float * inputPZ,__global float * inputPO,__global float * inputEZ,__global float * inputEO,__global int * outputPZ,__global int * outputPO, int CPZ, int CPO, int CEZ, int CEO)
  2. {
  3. unsigned int nx = get_global_id(0);
  4. unsigned int ny = get_global_id(1);
  5. unsigned int n = ny * get_global_size(0) + nx;
  6.  
  7. float expos;
  8. float eypos;
  9. float esize;
  10.  
  11. if (n < CPZ)
  12.   {
  13.   float xpos = inputPZ[n*3];
  14.   float ypos = inputPZ[n*3+1];
  15.   float size = inputPZ[n*3+2];
  16.     outputPZ[n] = -1;
  17.     for(int i = 0; i < CEO; i++)
  18.       {
  19.         expos = inputEO[i*3];
  20.         eypos = inputEO[i*3+1];
  21.         esize = inputEO[i*3+1];
  22.         if (abs(xpos - expos) < (size + esize) * 0.5f)
  23.           {
  24.             if (abs(ypos - eypos) < (size + esize) * 0.5f)
  25.               {
  26.                 outputPZ[n] = i;
  27.                 }
  28.             }
  29.         }
  30.     }
  31. else
  32.   {
  33.     float xpos = inputPO[(n - CPZ)*3];
  34.   float ypos = inputPO[(n - CPZ)*3+1];
  35.   float size = inputPO[(n - CPZ)*3+2];
  36.     outputPO[n] = -1;
  37.     for(int i = 0; i < CEZ; i++)
  38.       {
  39.         expos = inputEZ[i*3];
  40.         eypos = inputEZ[i*3+1];
  41.         esize = inputEZ[i*3+2];
  42.         if (abs(xpos - expos) < (size + esize) * 0.5f)
  43.           {
  44.             if (abs(ypos - eypos) < (size + esize) * 0.5f)
  45.               {
  46.                 outputPO[n] = i;
  47.                 }
  48.             }
  49.         }
  50.     }
  51. }


Das hier sagt der Log, der automatisch erstellt wird.

Code:
  1. clCreateCommandQueue: Success;
  2. clCreateBuffer: Success;
  3. clEnqueueWriteBuffer: Success;
  4. clCreateBuffer: Success;
  5. clEnqueueWriteBuffer: Success;
  6. clCreateBuffer: Success;
  7. clEnqueueWriteBuffer: Success;
  8. clCreateBuffer: Success;
  9. clEnqueueWriteBuffer: Success;
  10. clCreateBuffer: Success;
  11. clCreateBuffer: Success;
  12. clCreateProgramWithSource: Success;
  13. clBuildProgram: build program failure;
  14. clGetProgramInfo: Success;
  15. clGetProgramInfo: Success;
  16. CL_PROGRAM_SOURCE: <Nochmal der Kernel Code>
  17.  
  18. clGetProgramInfo: Success;
  19. clGetProgramInfo: Success;
  20. clCreateKernel: invalid program executable;
  21. clSetKernelArg: invalid kernel;
  22. clSetKernelArg: invalid kernel;
  23. clSetKernelArg: invalid kernel;
  24. clSetKernelArg: invalid kernel;
  25. clSetKernelArg: invalid kernel;
  26. clSetKernelArg: invalid kernel;
  27. clSetKernelArg: invalid kernel;
  28. clSetKernelArg: invalid kernel;
  29. clSetKernelArg: invalid kernel;
  30. clSetKernelArg: invalid kernel;


Und das ist der Pascal Code:

Code:
  1. type TInputRecord = packed record
  2.   X, Y, Life: TCL_Float;
  3.   end;
  4. type PInputRecord = ^TInputRecord;
  5. type TAInputRecord = array[0..MAX_DC_BIT_COUNT] of TInputRecord;
  6. type PAInputRecord = ^TAInputRecord;
  7.  
  8. var DCLPlatforms: TDCLPlatforms;
  9. var InputPZ, InputPO, InputEZ, InputEO: TAInputRecord;
  10. var OutputPZ, OutputPO: array[0..MAX_DC_BIT_COUNT] of TCL_Int;
  11.  
  12. procedure CLRunCollisions();
  13. var
  14.   CommandQueue: TDCLCommandQueue;
  15.   MainProgram: TDCLProgram;
  16.   Kernel : TDCLKernel;
  17.   InputBufferPZ, InputBufferPO, InputBufferEZ, InputBufferEO, OutputBufferPZ, OutputBufferPO: TDCLBuffer;
  18.   CPZ, CPO, CEZ, CEO: integer;
  19.   filtertype: Byte;
  20.   SourceName: String;
  21. begin
  22. DCLPlatforms := TDCLPlatforms.Create();
  23. with DCLPlatforms.Platforms[0].DeviceWithMaxClockFrequency do
  24.   begin
  25.   CommandQueue := CreateCommandQueue();
  26.  
  27.   CPZ := TheMatch.Player.ListOfZero.Count;
  28.   CPO := TheMatch.Player.ListOfOne.Count;
  29.   CEZ := TheMatch.Enemy.ListOfZero.Count;
  30.   CEO := TheMatch.Enemy.ListOfOne.Count;
  31.  
  32.   TheMatch.Player.WriteToBuffer(@InputPZ, 0);
  33.   TheMatch.Player.WriteToBuffer(@InputPO, 1);
  34.   TheMatch.Enemy.WriteToBuffer(@InputEZ, 0);
  35.   TheMatch.Enemy.WriteToBuffer(@InputEO, 1);
  36.  
  37.   InputBufferPZ := CreateBuffer(TheMatch.Player.ListOfZero.Count * SizeOf(TCL_Float) * 3,nil,[mfReadOnly]);
  38.   CommandQueue.WriteBuffer(InputBufferPZ, TheMatch.Player.ListOfZero.Count * SizeOf(TCL_Float) * 3, @InputPZ[0]);
  39.  
  40.   InputBufferPO := CreateBuffer(TheMatch.Player.ListOfOne.Count * SizeOf(TCL_Float) * 3,nil,[mfReadOnly]);
  41.   CommandQueue.WriteBuffer(InputBufferPO, TheMatch.Player.ListOfOne.Count * SizeOf(TCL_Float) * 3, @InputPO[0]);
  42.  
  43.   InputBufferEZ := CreateBuffer(TheMatch.Enemy.ListOfZero.Count * SizeOf(TCL_Float) * 3,nil,[mfReadOnly]);
  44.   CommandQueue.WriteBuffer(InputBufferEZ, TheMatch.Enemy.ListOfZero.Count * SizeOf(TCL_Float) * 3, @InputEZ[0]);
  45.  
  46.   InputBufferEO := CreateBuffer(TheMatch.Enemy.ListOfOne.Count * SizeOf(TCL_Float) * 3,nil,[mfReadOnly]);
  47.   CommandQueue.WriteBuffer(InputBufferEO, TheMatch.Enemy.ListOfOne.Count * SizeOf(TCL_Float) * 3, @InputEO[0]);
  48.  
  49.   OutputBufferPZ := CreateBuffer(TheMatch.Player.ListOfZero.Count * SizeOf(TCL_Int), nil,[mfWriteOnly]);
  50.   OutputBufferPO := CreateBuffer(TheMatch.Player.ListOfOne.Count * SizeOf(TCL_Int), nil,[mfWriteOnly]);
  51.  
  52.   MainProgram := CreateProgram('dccollision.cl');
  53.  
  54.   Kernel := MainProgram.CreateKernel('dccollide');
  55.   Kernel.SetArg(0,InputBufferPZ);
  56.   Kernel.SetArg(1,InputBufferPO);
  57.   Kernel.SetArg(2,InputBufferEZ);
  58.   Kernel.SetArg(3,InputBufferEO);
  59.   Kernel.SetArg(4,OutputBufferPZ);
  60.   Kernel.SetArg(5,OutputBufferPO);
  61.   Kernel.SetArg(6,SizeOf(@CPZ),@CPZ);
  62.   Kernel.SetArg(7,SizeOf(@CPO),@CPO);
  63.   Kernel.SetArg(8,SizeOf(@CEZ),@CEZ);
  64.   Kernel.SetArg(9,SizeOf(@CEO),@CEO);
  65.  
  66.   CommandQueue.Execute(Kernel, CPZ + CPO);
  67.  
  68.   CommandQueue.ReadBuffer(OutputBufferPZ, CPZ * SizeOf(TCL_int), @OutputPZ);
  69.   CommandQueue.ReadBuffer(OutputBufferPO, CPO * SizeOf(TCL_int), @OutputPO);
  70.  
  71.   Kernel.Free();
  72.   MainProgram.Free();
  73.   OutputBufferPZ.Free();
  74.   OutputBufferPO.Free();
  75.   InputBufferPZ.Free();
  76.   InputBufferPO.Free();
  77.   InputBufferEZ.Free();
  78.   InputBufferEO.Free();
  79.   CommandQueue.Free();
  80.   end;
  81. DCLPlatforms.Free();
  82. end;


Ich weis, dass ist ein ganzer Haufen an Code, aber ich wollte nichts aussortieren, wo vielleicht der Fehler liegen könnte.

Was soll der Kernel tun: Im Spiel gibt es 0en und 1en von zwei Spielern. Wenn eine 0 mit einer 1 oder umgekehrt von zwei verschiedenen Spielern kollidieren sollen sich diese auslöschen. Der Kernel soll alle 0en und 1en des Spielers durchgehen und in den Ausgabebuffer den Index schreiben mit der diese kollidiert. Ich weis das ermöglicht nur maximal einen Kollision pro 0 oder 1 aber das ist erstmal egal.

Danke schonmal!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenCL Problem
BeitragVerfasst: Mi Jul 10, 2013 08:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
hatte jetzt keine Lust das alles zu lesen. clGetProgramBuildInfo sollte dir aber genau sagen was das Problem ist.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenCL Problem
BeitragVerfasst: Mi Jul 10, 2013 10:56 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Nov 30, 2011 21:41
Beiträge: 136
Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
Hmm... Ich habs den von dir genannten Befehl mal eingebunden, aber es kommt SUCCESS als Rückgabewert.

Im Log steht Folgendes, was in meinen Augen irgendwie keinen Sinn ergibt^^.
Code:
  1. clBuildProgram: build program failure;
  2. clGetProgramBuildInfo: Success;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenCL Problem
BeitragVerfasst: Mi Jul 10, 2013 11:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Die Funktion gibt ein CL_SUCCESS wenn sie erfolgreich ausgefuehrt wurde. Sprich kein falsche Program,Device,usw.. Die eigentliche Ausgabe ist der Parameter "param_value" dort muesstest du fuer CL_PROGRAM_BUILD_STATUS einen cl_build_status bekommen und fuer CL_PROGRAM_BUILD_LOG ein char array.

kuckst du hier

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenCL Problem
BeitragVerfasst: Mi Jul 10, 2013 11:40 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Nov 30, 2011 21:41
Beiträge: 136
Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
ok. Danke schonmal, weiterhelfen tut mir das leider irgendwie immernoch nicht :/

Code:
  1. X STATUS: Success|device not available
  2. X LOG: invalid value|NULNULNULNULNUL...


Code:
  1. var
  2.   b: tcl_build_status;
  3.   a: TCL_Int;
  4.   q, i: integer;
  5.   FChars: Array[0..999] of Char;
  6. begin
  7.   q := sizeof(b);
  8.   b := 0;
  9.   a := clGetProgramBuildInfo(FProgram, CDevice, CL_PROGRAM_BUILD_STATUS, q,@b,nil);
  10.   WriteLog('X STATUS: ' + GetString(a) + '|' + GetString(b));
  11.  
  12.   q := sizeof(FChars);
  13.   a := clGetProgramBuildInfo(FProgram, CDevice, CL_PROGRAM_BUILD_LOG, q,@FChars,nil);
  14.   s := '';
  15.   for i := 0 to 999 do
  16.     begin
  17.     s := s + FChars[i];
  18.     end;
  19.   WriteLog('X LOG: ' + GetString(a) + '|' + s);


So versuche ich, mir die Informationen ausgeben zu lassen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenCL Problem
BeitragVerfasst: Mi Jul 10, 2013 16:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
ja jetzt ist die methode fehl geschlagen, denn:
Zitat:
Specifies the size in bytes of memory pointed to by param_value. This size must be greater than or equal to the size of return type as described in the table above.

also erst die string länge ermitteln und dann den string auslesen:
Code:
  1.  
  2. size_t length;
  3. char * buildlog;
  4. clGetProgramBuildInfo({PROGRAM}, {DEVICE},  CL_PROGRAM_BUILD_LOG, 0, NULL, &length)
  5. buildlog = (char*) malloc(sizeof(char) * (length +1));
  6. clGetProgramBuildInfo({PROGRAM}, {DEVICE}, CL_PROGRAM_BUILD_LOG, length+1, buildlog, NULL);
  7.  


das +1 ist glaube ich nicht notwendig in pascal...

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenCL Problem
BeitragVerfasst: Mi Jul 10, 2013 22:36 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Nov 30, 2011 21:41
Beiträge: 136
Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
VIELEN VIELEN DANK!!!

- Fehler wurden angezeigt.
- Fehler beseitigt.
- Nochmal getestet.
- Kleinen weiteren Fehler beseitigt.
- Nochmal getestet.
- Funktioniert prima!!!!! :) :) :)

Danke nochmal. Ohne deine Hilfe hätte ich das nie hinbekommen!


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.028s | 17 Queries | GZIP : On ]