我在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!
答案 0 :(得分:0)
您正在将一个半变量传递给内核,但内核需要一个指向半数数组的指针。
如果你想将一半的数组传递给GPU,你仍然必须使用cl_mem对象,然后包含halfs数组。