2016-06-24 3 views
0

私は、MacのOpenCLコードをNVIDIA Tesla K20cカードを搭載したLinuxボックスに変換しており、単純なカーネルを構築するときに悩まされています。OpenCL無効なカーネル名

const char* srccode = kernel; 
cl_program program = clCreateProgramWithSource(context, 1, &srccode, NULL, &err); 
err = clBuildProgram(program, 0, NULL, NULL, NULL, NULL); 
kernel = clCreateKernel(program, "diff", &err); 

clBuildProgram戻りCL_SUCCESSclBuildProgramInfoからのログは空ですが、clCreateKernel戻りCL_INVALID_KERNEL_NAME

char kernel[1024] = 
"#pragma OPENCL EXTENSION cl_khr_fp64: enable \ 
               \ 
kernel void diff(global double* u,   \ 
        int N,      \ 
        double dx,     \ 
        global double* du)   \ 
{            \ 
    size_t i = get_global_id(0);    \ 
    int ip = (i+1)%N;       \ 
    int im = (i+N-1)%N;      \ 
    du[i] = (u[ip] - u[im])/dx/2.;   \ 
}"; 

私はこれを呼び出す:私のカーネルのコードはこれです。どんな考え?私はこれをしばらく叩いていて何も見つけることができません。すべての倍精度浮動小数点数を変更してプラグマを削除すると、問題はなくなり、正しく動作します。プラグマは責任があるのですか?もしそうなら、私はそれを正しく行うにはどうすればいいですか?

+0

同じエラーが発生した場合は、プラグマを削除するだけで、デバイスコンパイラの適切な改行文字(プログラミング環境とは異なる可能性があります)が検索されます。 –

答えて

2

kernel[1024]文字列全体が1行で終了しますが、これはカーネル定義には問題ありませんが、pragmaにはありません。そこには最終行文字が必要です。

char kernel[1024] = 
"#pragma OPENCL EXTENSION cl_khr_fp64: enable \n\ 
               \ 
kernel void diff(global double* u,   \ 
        int N,      \ 
        double dx,     \ 
        global double* du)   \ 
{            \ 
    size_t i = get_global_id(0);    \ 
    int ip = (i+1)%N;       \ 
    int im = (i+N-1)%N;      \ 
    du[i] = (u[ip] - u[im])/dx/2.;   \ 
}"; 
+0

ありがとう!それがトリックでした。 – Chopp

関連する問題