Skip to content

Commit 735b688

Browse files
authored
[libspirv] reuse clc function in __spirv_ocl_normalize/fast_normalize (#19722)
Before this PR, libspirv-nvptx64--nvidiacl uses __nv_rsqrtf/isinf/copysign in these two functions, and libspirv-amdgcn--amdhsa uses __ocml_rsqrt/copysign. We can upstream use of target built-in to CLC library: Use of __nv_rsqrtf/isinf is to be upstreamed by llvm/llvm-project#150174. Then the changes to libspirv-nvptx64--nvidiacl should be minimized. Generic implementation of __clc_rsqrt is better than __ocml_rsqrt according to llvm/llvm-project#152436. Use of these target built-in scalarize llvm vector intrinsic. So it is likely better to use generic implementation. In addition, use of generic implementation aligns with OpenCL library. Delete libspirv/generic/math/floatn.inc. Delete unused clc/relational/floatn.inc and libspirv/generic/math/minmag.inc.
1 parent 47f90e6 commit 735b688

File tree

6 files changed

+12
-359
lines changed

6 files changed

+12
-359
lines changed

libclc/clc/include/clc/relational/floatn.inc

Lines changed: 0 additions & 132 deletions
This file was deleted.

libclc/libspirv/include/libspirv/generic/math/floatn.inc

Lines changed: 0 additions & 97 deletions
This file was deleted.

libclc/libspirv/include/libspirv/generic/math/minmag.inc

Lines changed: 0 additions & 26 deletions
This file was deleted.

libclc/libspirv/lib/generic/geometric/fast_normalize.cl

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,12 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9+
#include <clc/geometric/clc_fast_normalize.h>
910
#include <libspirv/spirv.h>
1011

11-
_CLC_OVERLOAD _CLC_DEF float __spirv_ocl_fast_normalize(float p) {
12-
return __spirv_ocl_normalize(p);
13-
}
14-
15-
#define __CLC_BODY <fast_normalize.inc>
12+
#define FUNCTION __spirv_ocl_fast_normalize
13+
#define __IMPL_FUNCTION(x) __clc_fast_normalize
14+
#define __CLC_GEOMETRIC_RET_GENTYPE
15+
#define __CLC_BODY <clc/geometric/unary_def.inc>
1616
#define __FLOAT_ONLY
17-
#include <libspirv/generic/math/floatn.inc>
18-
#undef __FLOAT_ONLY
17+
#include <clc/math/gentype.inc>

libclc/libspirv/lib/generic/geometric/fast_normalize.inc

Lines changed: 0 additions & 17 deletions
This file was deleted.

libclc/libspirv/lib/generic/geometric/normalize.cl

Lines changed: 6 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -6,86 +6,12 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9-
#include <clc/clc_convert.h>
10-
#include <clc/relational/clc_all.h>
9+
#include <clc/geometric/clc_normalize.h>
1110
#include <libspirv/spirv.h>
1211

13-
#define HALF_MAX_SQRT 0x1.0p+8h
14-
#define HALF_MIN_SQRT 0x1.0p-8h
12+
#define FUNCTION __spirv_ocl_normalize
13+
#define __IMPL_FUNCTION(x) __clc_normalize
14+
#define __CLC_GEOMETRIC_RET_GENTYPE
15+
#define __CLC_BODY <clc/geometric/unary_def.inc>
1516

16-
#define _CLC_SPIRV_NORMALIZE_IMPL(FP_TYPE, FLOAT_MARK, INT_TYPE, VLEN, \
17-
MAX_SQRT, MIN_SQRT) \
18-
_CLC_OVERLOAD _CLC_DEF FP_TYPE##VLEN __spirv_ocl_normalize( \
19-
FP_TYPE##VLEN p) { \
20-
if (__clc_all(p == (FP_TYPE##VLEN)0.0##FLOAT_MARK)) \
21-
return p; \
22-
FP_TYPE l2 = __spirv_Dot(p, p); \
23-
if (l2 < FLT_MIN) { \
24-
p *= MAX_SQRT; \
25-
l2 = __spirv_Dot(p, p); \
26-
} else if (l2 == INFINITY) { \
27-
p *= MIN_SQRT; \
28-
l2 = __spirv_Dot(p, p); \
29-
if (l2 == INFINITY) { \
30-
p = __spirv_ocl_copysign( \
31-
__spirv_ocl_select( \
32-
(FP_TYPE##VLEN)0.0##FLOAT_MARK, \
33-
(FP_TYPE##VLEN)1.0##FLOAT_MARK, \
34-
__clc_convert_##INT_TYPE##VLEN(__spirv_IsInf(p))), \
35-
p); \
36-
l2 = __spirv_Dot(p, p); \
37-
} \
38-
} \
39-
return p * __spirv_ocl_rsqrt(l2); \
40-
}
41-
42-
#define _CLC_SPIRV_NORMALIZE(VLEN) \
43-
_CLC_SPIRV_NORMALIZE_IMPL(float, f, int, VLEN, 0x1.0p+86F, 0x1.0p-65f)
44-
45-
_CLC_OVERLOAD _CLC_DEF float __spirv_ocl_normalize(float p) {
46-
return __spirv_ocl_sign(p);
47-
}
48-
49-
_CLC_SPIRV_NORMALIZE(2)
50-
_CLC_SPIRV_NORMALIZE(3)
51-
_CLC_SPIRV_NORMALIZE(4)
52-
53-
#undef _CLC_SPIRV_NORMALIZE
54-
55-
#ifdef cl_khr_fp64
56-
57-
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
58-
59-
#define _CLC_SPIRV_NORMALIZE(VLEN) \
60-
_CLC_SPIRV_NORMALIZE_IMPL(double, , long, VLEN, 0x1.0p+563, 0x1.0p-513)
61-
62-
_CLC_OVERLOAD _CLC_DEF double __spirv_ocl_normalize(double p) {
63-
return __spirv_ocl_sign(p);
64-
}
65-
66-
_CLC_SPIRV_NORMALIZE(2)
67-
_CLC_SPIRV_NORMALIZE(3)
68-
_CLC_SPIRV_NORMALIZE(4)
69-
70-
#undef _CLC_SPIRV_NORMALIZE
71-
72-
#endif
73-
74-
#ifdef cl_khr_fp16
75-
76-
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
77-
78-
#define _CLC_SPIRV_NORMALIZE(VLEN) \
79-
_CLC_SPIRV_NORMALIZE_IMPL(half, h, short, VLEN, HALF_MAX_SQRT, HALF_MIN_SQRT)
80-
81-
_CLC_OVERLOAD _CLC_DEF half __spirv_ocl_normalize(half p) {
82-
return __spirv_ocl_sign(p);
83-
}
84-
85-
_CLC_SPIRV_NORMALIZE(2)
86-
_CLC_SPIRV_NORMALIZE(3)
87-
_CLC_SPIRV_NORMALIZE(4)
88-
89-
#undef _CLC_SPIRV_NORMALIZE
90-
91-
#endif
17+
#include <clc/math/gentype.inc>

0 commit comments

Comments
 (0)