OpenCL:调用参数类型与函数签名不匹配

时间:2017-08-04 08:03:45

标签: opencl

我在OpenCL 1.2中使用#pragma OPENCL EXTENSION cl_khr_fp16 : enable支持的GPU。我想通过changin float precision从32到16检查性能改进。在我的设备内核中,我将所有float转换为half,如下所示:

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

在我的主持人方面,我将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!

1 个答案:

答案 0 :(得分:0)

您正在将一个半变量传递给内核,但内核需要一个指向半数数组的指针。

如果你想将一半的数组传递给GPU,你仍然必须使用cl_mem对象,然后包含halfs数组。