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!
X&Yをcl_memに戻しました。私は&Xをcl_halfの配列を指すカーネル関数に渡しています。しかし、同じエラーです。 – Avis
そしてハーフを浮動小数点に変更すると正しく動作しますか? – Jovasa
私は半分をフロートに変更すると動作します。別のGPUのデバイスコードで半分のデータ型を試すと、エラー番号-52(CL_INVALID_KERNEL_ARGS)が出ます。 – Avis