【问题标题】:OpenCL: Call parameter type does not match function signatureOpenCL:调用参数类型与函数签名不匹配
【发布时间】:2018-01-12 01:43:00
【问题描述】:

我正在使用带有 OpenCL 1.2 的 #pragma OPENCL EXTENSION cl_khr_fp16 : enable 支持的 GPU。我想通过将浮点精度从 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!

【问题讨论】:

    标签: opencl


    【解决方案1】:

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

    如果您想将半个数组传递给 GPU,您仍然必须使用 cl_mem 对象,该对象会包含半个数组。

    【讨论】:

    • 我将 X 和 Y 改回 cl_mem。我将 &X 传递给指向 cl_half 数组的内核函数。但仍然是同样的错误。
    • 如果你把半边改成浮动,它可以正常工作吗?
    • 当我将一半更改为浮动时它可以工作。当我在另一个 GPU 的设备代码中尝试使用 half 数据类型时,我得到错误号 -52 (CL_INVALID_KERNEL_ARGS)。
    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多