2016-04-25 5 views
0

Ich bin neu bei OpenCL und ich versuche parallel ein Kantenerkennungsprogramm zu erstellen. Ich versuche, einen Kernel aus der Kantendetektionsfunktion zu schreiben. Die ursprüngliche Funktion:OpenCL Kernel Error -11

void edgeDetection(float *out, float *in, int w, int h) { 
    int r,c; 
    for (r = 0; r < h-2; r++) { 
     for (c = 0; c < w-2; c++) { 
      float G; 
      float* pOut = &out[r*w + c]; 
      float Gx = 0.0; 
      float Gy = 0.0; 

      int fr,fc; 
      /* run the 2d-convolution filter */ 
      for (fr = 0; fr < 3; fr++) { 
       for (fc = 0; fc < 3; fc++) { 
        float p = in[(r+fr)*w + (c+fc)]; 
        /* X-directional edges */ 
        Gx += p * F[fr*3 + fc]; 
        /* Y-directional edges */ 
        Gy += p * F[fc*3 + fr]; 
       } 
      } 
      /* all edges, pythagoral sum */ 
      G = sqrtf(Gx*Gx + Gy*Gy); 
      *pOut = G; 
     } 
    } 
} 

Mein OpenCL Kernel:

__kernel 
void edgeDetection(__global float *out, 
__global float *in, int w, int h) 
{ 

    // Get the work-item’s unique ID 
    const int r = get_global_id(0); 
    const int c = get_global_id(1); 
    if(r>=0 && c>=0 && r<h-2 && c<w-2){ 
      float G; 
      float* pOut = &out[r*w + c]; 
      float Gx = 0.0; 
      float Gy = 0.0; 

      int fr,fc; 

      for (fr = 0; fr < 3; fr++) { 
       for (fc = 0; fc < 3; fc++) { 

        float p = in[(r+fr)*w + (c+fc)]; 

        Gx += p * F[fr*3 + fc]; 

        Gy += p * F[fc*3 + fr]; 
       } 
      } 
      G = sqrtf(Gx*Gx + Gy*Gy); 
      *pOut = G; 
    } 
} 

Wenn ich versuche, das Programm von der .cl Datei mit diesem (chk zu bauen ist eine Funktion, um zu überprüfen, ob es irgendwelche Ausfälle/Fehler):

status = clBuildProgram(program, 1, &device, NULL, NULL, NULL); 
chk(status, "clBuildProgram"); 

Ich bekomme einen Fehler, der sagt, "clBuildProgram fehlgeschlagen (-11)". Aus meinen Recherchen habe ich gesehen, dass es allgemein bekannt ist, dass dieser Fehler durch einen Syntaxfehler verursacht wird. Nach vielen Überprüfungen kann ich jedoch nichts besonderes mit meinem Kernel sehen. Kann mir jemand helfen, herauszufinden, was damit nicht stimmt?

+1

Verwenden Sie https://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clGetProgramBuildInfo.html mit CL_PROGRAM_BUILD_LOG, um den Compiler anzumelden, was bei der Kompilierung falsch gelaufen ist. Es ist wahrscheinlich ein dummer Fehler. Ist F in Ihrem Kernel definiert? – DarkZeros

Antwort

2

Es gibt viele Fehler im Code:

1)

float* pOut = &out[r*w + c]; 

Dies ist ungültig, sollte es sein:

__global float* pOut = &out[r*w + c]; 

2) Sie verwenden F im Kernel die wurde nie definiert.

3) sqrtf ist nicht in CL definiert, meinst du sqrt stattdessen?