Added OpenCL source.
This commit is contained in:
parent
2a5110aa04
commit
27e862da62
30 changed files with 10922 additions and 1 deletions
29
src/backend/opencl/cl/cn/fast_div_heavy.cl
Normal file
29
src/backend/opencl/cl/cn/fast_div_heavy.cl
Normal file
|
@ -0,0 +1,29 @@
|
|||
R"===(
|
||||
#ifndef FAST_DIV_HEAVY_CL
|
||||
#define FAST_DIV_HEAVY_CL
|
||||
|
||||
inline long fast_div_heavy(long _a, int _b)
|
||||
{
|
||||
long a = abs(_a);
|
||||
int b = abs(_b);
|
||||
|
||||
float rcp = native_recip(convert_float_rte(b));
|
||||
float rcp2 = as_float(as_uint(rcp) + (32U << 23));
|
||||
|
||||
ulong q1 = convert_ulong(convert_float_rte(as_int2(a).s1) * rcp2);
|
||||
a -= q1 * as_uint(b);
|
||||
|
||||
float q2f = convert_float_rte(as_int2(a >> 12).s0) * rcp;
|
||||
q2f = as_float(as_uint(q2f) + (12U << 23));
|
||||
long q2 = convert_long_rte(q2f);
|
||||
int a2 = as_int2(a).s0 - as_int2(q2).s0 * b;
|
||||
|
||||
int q3 = convert_int_rte(convert_float_rte(a2) * rcp);
|
||||
q3 += (a2 - q3 * b) >> 31;
|
||||
|
||||
const long q = q1 + q2 + q3;
|
||||
return ((as_int2(_a).s1 ^ _b) < 0) ? -q : q;
|
||||
}
|
||||
|
||||
#endif
|
||||
)==="
|
Loading…
Add table
Add a link
Reference in a new issue