2016-04-25 13 views
0

私はOpenCLを初めて使い、エッジ検出プログラムを並列化しようとしています。エッジ検出機能からカーネルを作成しようとしています。 元の関数:OpenCLカーネルエラー-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; 
     } 
    } 
} 

私のOpenCLカーネル:

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

私はどんな障害があるかどうかを確認するための機能を、この(CHKをされて使用して.clファイルからプログラムを構築しよう/エラー):

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

「clBuildProgram failed(-11)」というエラーが表示されます。私の研究から、このエラーは構文エラーが原因であることが一般的にわかっています。しかし、何度もチェックした後、私のカーネルには特に何かが間違っているのを見ることはできません。誰かが私に何が間違っているのか理解してもらうことができますか?

1)

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

これが無効であるが、それは次のようになります:

+1

https://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clGetProgramBuildInfo.htmlとCL_PROGRAM_BUILD_LOGを使用して、コンパイルで何が問題になったのかのコンパイラログを取得します。それはおそらく愚かなエラーです。 Fはあなたのカーネルで定義されていますか? – DarkZeros

答えて

2

コード内の多くのエラーがあります

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

2)あなたは、カーネルにFを使用しています決して定義されませんでした。

3)sqrtfはCLで定義されていません。代わりにsqrtを意味しましたか?

関連する問題