OpenCL:调用参数类型与函数签名不匹配
问题描述:
我使用#pragma OPENCL EXTENSION cl_khr_fp16 : enable
受支持的OpenCL 1.2 GPU。我想通过了变化float精度从32到16。在我的设备内核来检查的性能改善,我转换所有float
到half
像如下所示: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];
}
以我主机端,我提出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!
答
你传递一个半可变内核,但内核期望的指针一半的阵列。
如果要将一半数组传递给GPU,则仍然必须使用包含半数数组的cl_mem对象。
我将X&Y更改回cl_mem。我将&X传递给指向cl_half数组的内核函数。但仍然是同样的错误。 – Avis
如果你改变了一半以漂浮它可以正常工作? – Jovasa
它在我将一半更改为浮动时有效。当我尝试在另一个GPU的设备代码中使用半数据类型时,我得到错误号-52(CL_INVALID_KERNEL_ARGS)。 – Avis