2017-08-04 14 views
0

OpenCL 1.2でサポートされている#pragma OPENCL EXTENSION cl_khr_fp16 : enableのGPUを使用しています。以下に示すように、私は私のデバイスカーネルで32から16にフロート精度をCHANGINによって性能改善を確認したかった、私はhalfに全てfloat変換:OpenCL:コールパラメータタイプが関数シグネチャと一致しません

__kernel void copy_kernel(int N, __global half *X, __global half *Y) 
{ 
    int i = get_global_id(0); 
    if(i < N) Y[i] = X[i]; 
} 

私のホスト側で、Iは、アレイにcl_memポイントを作っcl_half。以下に示すように、ホストプログラムが見えます:

void copy(int N, cl_mem X, cl_mem Y) 
{ 
    cl_kernel kernel = get_copy_kernel(); 
    cl_command_queue queue = cl.queue; 

    cl_uint i = 0; 

    cl.error = clSetKernelArg(kernel, i++, sizeof(N), (void*) &N); 
    cl.error = clSetKernelArg(kernel, i++, sizeof(X), (void*) &X); 
    cl.error = clSetKernelArg(kernel, i++, sizeof(Y), (void*) &Y); 
    check_error_cl(cl); 

    size_t gsize = N; 
    cl.error = clEnqueueNDRangeKernel(queue, kernel, 1, 0, &gsize, 0, 0, 0, NULL); 
    check_error_cl(cl); 
} 

しかし、カーネルのコンパイル中に、私は以下のエラーが出ます:

Call parameter type does not match function signature! 
    %32 = load half addrspace(1)* %31, align 2 
float %33 = call float @llvm.nvvm.mul.rn.f(half %32, half %19) 
Broken module found, compilation terminated! 

答えて

0

あなたがカーネルに半分の変数を渡しているが、カーネルはへのポインタを期待します半分の配列。

ハーフの配列をGPUに渡す場合は、cl_memオブジェクトを使用する必要があります。オブジェクトにはハーフの配列が含まれています。

+0

X&Yをcl_memに戻しました。私は&Xをcl_halfの配列を指すカーネル関数に渡しています。しかし、同じエラーです。 – Avis

+0

そしてハーフを浮動小数点に変更すると正しく動作しますか? – Jovasa

+0

私は半分をフロートに変更すると動作します。別のGPUのデバイスコードで半分のデータ型を試すと、エラー番号-52(CL_INVALID_KERNEL_ARGS)が出ます。 – Avis

関連する問題