2017-08-04 84 views
0

我使用#pragma OPENCL EXTENSION cl_khr_fp16 : enable受支持的OpenCL 1.2 GPU。我想通过了变化float精度从32到16。在我的设备内核来检查的性能改善,我转换所有floathalf像如下所示: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! 

回答

0

你传递一个半可变内核,但内核期望的指针一半的阵列。

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

+0

我将X&Y更改回cl_mem。我将&X传递给指向cl_half数组的内核函数。但仍然是同样的错误。 – Avis

+0

如果你改变了一半以漂浮它可以正常工作? – Jovasa

+0

它在我将一半更改为浮动时有效。当我尝试在另一个GPU的设备代码中使用半数据类型时,我得到错误号-52(CL_INVALID_KERNEL_ARGS)。 – Avis

相关问题