【发布时间】: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