我正在尝试优化使用Android的Exynos Octa 8890和Mali-T880在Samsung Galaxy S7(SM-G930F)上运行的OpenCL代码。根据OpenCL-Z,gpu支持OpenCL 1.2完整档案。我有很多正确编译和运行的OpenCL代码。但是,我不能使用任何half_ *或native_ *函数,例如:half_sin或native_sin。一旦我添加其中一个,我在编译内核时会得到一个CL_BUILD_FAILURE。这是发生此类行为的一个内核:
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
half distancePointToEllipse(short2 point, half2 ecenter, half phi, half a, half b)
{
half2 t = convert_half2(point) - ecenter;
half angle = atan2(t.y, t.x) - phi;
half cos1, sin1;
//cos1 = native_cos(angle);
//sin1 = native_sin(angle);
sin1 = sincos(angle, &cos1);
half tx = a * a * cos1 * cos1;
half ty = b * b * sin1 * sin1;
//half c = native_sqrt(tx + ty);
//half d = native_sqrt(t.x * t.x + t.y * t.y);
half c = sqrt(tx + ty);
half d = hypot(t.x, t.y);
return fabs(d - c);
}
这是用于编译它的代码:
auto program_RANSACEllipses = cl::Program(context, CL_RANSAC_ELLIPSES_KERNEL, true);
program_RANSACEllipses.build("-cl-std=CL1.2");
Kernels::RANSACEllipses = cl::Kernel(program_RANSACEllipses, "RANSAC");
我已经从khronos下载了OpenCL 1.2的标题。此外,我之前可以在另一台设备上使用half_ *和native_ *。
你知道我做错了什么吗?
PS:我在ARM community上问了同样的问题,但该论坛并不活跃,所以我也决定在这里提问。