[libclc] [libclc] Move rsqrt to the CLC library (PR #129045)
Fraser Cormack via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 27 07:05:01 PST 2025
https://github.com/frasercrmck updated https://github.com/llvm/llvm-project/pull/129045
>From 4efd607ca71b91847c9271740df7aab4534fe01b Mon Sep 17 00:00:00 2001
From: Fraser Cormack <fraser at codeplay.com>
Date: Thu, 27 Feb 2025 12:48:25 +0000
Subject: [PATCH 1/3] [libclc] Move rsqrt to the CLC library
This also adds missing half variants to certain targets.
It also optimizes some targets' implementations to perform the operation
directly in vector types, as opposed to scalarizing.
---
libclc/CMakeLists.txt | 1 +
libclc/clc/include/clc/math/clc_rsqrt.h | 12 +++++++++
libclc/clc/lib/generic/SOURCES | 1 +
libclc/clc/lib/generic/math/clc_rsqrt.cl | 27 +++++++++++++++++++
libclc/clc/lib/generic/math/clc_rsqrt.inc | 4 +++
libclc/clc/lib/r600/SOURCES | 2 ++
.../clc/lib/r600/math/clc_rsqrt_override.cl | 20 ++++++++++++++
libclc/generic/lib/math/rsqrt.cl | 23 +++-------------
libclc/r600/lib/SOURCES | 1 -
libclc/r600/lib/math/rsqrt.cl | 22 ---------------
10 files changed, 71 insertions(+), 42 deletions(-)
create mode 100644 libclc/clc/include/clc/math/clc_rsqrt.h
create mode 100644 libclc/clc/lib/generic/math/clc_rsqrt.cl
create mode 100644 libclc/clc/lib/generic/math/clc_rsqrt.inc
create mode 100644 libclc/clc/lib/r600/SOURCES
create mode 100644 libclc/clc/lib/r600/math/clc_rsqrt_override.cl
delete mode 100644 libclc/r600/lib/math/rsqrt.cl
diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt
index 8f076be1599db..cc1abda7d7fce 100644
--- a/libclc/CMakeLists.txt
+++ b/libclc/CMakeLists.txt
@@ -31,6 +31,7 @@ set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS
clc/lib/amdgcn/SOURCES;
clc/lib/amdgpu/SOURCES;
clc/lib/clspv/SOURCES;
+ clc/lib/r600/SOURCES;
clc/lib/spirv/SOURCES;
)
diff --git a/libclc/clc/include/clc/math/clc_rsqrt.h b/libclc/clc/include/clc/math/clc_rsqrt.h
new file mode 100644
index 0000000000000..f05ef73074d26
--- /dev/null
+++ b/libclc/clc/include/clc/math/clc_rsqrt.h
@@ -0,0 +1,12 @@
+#ifndef __CLC_MATH_CLC_RSQRT_H__
+#define __CLC_MATH_CLC_RSQRT_H__
+
+#define __CLC_BODY <clc/math/unary_decl.inc>
+#define __CLC_FUNCTION __clc_rsqrt
+
+#include <clc/math/gentype.inc>
+
+#undef __CLC_BODY
+#undef __CLC_FUNCTION
+
+#endif // __CLC_MATH_CLC_RSQRT_H__
diff --git a/libclc/clc/lib/generic/SOURCES b/libclc/clc/lib/generic/SOURCES
index 97c504d21aa88..206c7c18ce1a1 100644
--- a/libclc/clc/lib/generic/SOURCES
+++ b/libclc/clc/lib/generic/SOURCES
@@ -33,6 +33,7 @@ math/clc_nan.cl
math/clc_nextafter.cl
math/clc_rint.cl
math/clc_round.cl
+math/clc_rsqrt.cl
math/clc_sqrt.cl
math/clc_sw_fma.cl
math/clc_trunc.cl
diff --git a/libclc/clc/lib/generic/math/clc_rsqrt.cl b/libclc/clc/lib/generic/math/clc_rsqrt.cl
new file mode 100644
index 0000000000000..18282e44f6dc6
--- /dev/null
+++ b/libclc/clc/lib/generic/math/clc_rsqrt.cl
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2014,2015 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include <clc/internal/clc.h>
+#include <clc/math/clc_sqrt.h>
+
+#define __CLC_BODY <clc_rsqrt.inc>
+#include <clc/math/gentype.inc>
diff --git a/libclc/clc/lib/generic/math/clc_rsqrt.inc b/libclc/clc/lib/generic/math/clc_rsqrt.inc
new file mode 100644
index 0000000000000..a4d2146887876
--- /dev/null
+++ b/libclc/clc/lib/generic/math/clc_rsqrt.inc
@@ -0,0 +1,4 @@
+__attribute__((weak)) _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE
+__clc_rsqrt(__CLC_GENTYPE val) {
+ return __CLC_FP_LIT(1.0) / __clc_sqrt(val);
+}
diff --git a/libclc/clc/lib/r600/SOURCES b/libclc/clc/lib/r600/SOURCES
new file mode 100644
index 0000000000000..9185bcf7f390e
--- /dev/null
+++ b/libclc/clc/lib/r600/SOURCES
@@ -0,0 +1,2 @@
+math/clc_rsqrt_override.cl
+
diff --git a/libclc/clc/lib/r600/math/clc_rsqrt_override.cl b/libclc/clc/lib/r600/math/clc_rsqrt_override.cl
new file mode 100644
index 0000000000000..86d8b2e12f53a
--- /dev/null
+++ b/libclc/clc/lib/r600/math/clc_rsqrt_override.cl
@@ -0,0 +1,20 @@
+#include <clc/clcmacro.h>
+#include <clc/internal/clc.h>
+
+_CLC_OVERLOAD _CLC_DEF float __clc_rsqrt(float x) {
+ return __builtin_r600_recipsqrt_ieeef(x);
+}
+
+_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, __clc_rsqrt, float);
+
+#ifdef cl_khr_fp64
+
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+_CLC_OVERLOAD _CLC_DEF double __clc_rsqrt(double x) {
+ return __builtin_r600_recipsqrt_ieee(x);
+}
+
+_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, __clc_rsqrt, double);
+
+#endif
diff --git a/libclc/generic/lib/math/rsqrt.cl b/libclc/generic/lib/math/rsqrt.cl
index b38d4a1c3cc82..150d6e0927170 100644
--- a/libclc/generic/lib/math/rsqrt.cl
+++ b/libclc/generic/lib/math/rsqrt.cl
@@ -1,22 +1,7 @@
#include <clc/clc.h>
-#include <clc/clcmacro.h>
+#include <clc/math/clc_rsqrt.h>
-_CLC_OVERLOAD _CLC_DEF float rsqrt(float x)
-{
- return 1.0f / sqrt(x);
-}
+#define FUNCTION rsqrt
+#define __CLC_BODY <clc/shared/unary_def.inc>
-_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, rsqrt, float);
-
-#ifdef cl_khr_fp64
-
-#pragma OPENCL EXTENSION cl_khr_fp64 : enable
-
-_CLC_OVERLOAD _CLC_DEF double rsqrt(double x)
-{
- return 1.0 / sqrt(x);
-}
-
-_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, rsqrt, double);
-
-#endif
+#include <clc/math/gentype.inc>
diff --git a/libclc/r600/lib/SOURCES b/libclc/r600/lib/SOURCES
index 6e01bbb2b8b99..cad45785dc483 100644
--- a/libclc/r600/lib/SOURCES
+++ b/libclc/r600/lib/SOURCES
@@ -1,7 +1,6 @@
math/fmax.cl
math/fmin.cl
math/native_rsqrt.cl
-math/rsqrt.cl
synchronization/barrier.cl
workitem/get_global_offset.cl
workitem/get_group_id.cl
diff --git a/libclc/r600/lib/math/rsqrt.cl b/libclc/r600/lib/math/rsqrt.cl
deleted file mode 100644
index 53f7d4040463f..0000000000000
--- a/libclc/r600/lib/math/rsqrt.cl
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <clc/clc.h>
-#include <clc/clcmacro.h>
-
-_CLC_OVERLOAD _CLC_DEF float rsqrt(float x)
-{
- return __builtin_r600_recipsqrt_ieeef(x);
-}
-
-_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, rsqrt, float);
-
-#ifdef cl_khr_fp64
-
-#pragma OPENCL EXTENSION cl_khr_fp64 : enable
-
-_CLC_OVERLOAD _CLC_DEF double rsqrt(double x)
-{
- return __builtin_r600_recipsqrt_ieee(x);
-}
-
-_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, rsqrt, double);
-
-#endif
>From b0229791003fdbc40609901adffd4c4ccd8755a1 Mon Sep 17 00:00:00 2001
From: Fraser Cormack <fraser at codeplay.com>
Date: Thu, 27 Feb 2025 12:50:24 +0000
Subject: [PATCH 2/3] remove blank line
---
libclc/clc/lib/r600/SOURCES | 1 -
1 file changed, 1 deletion(-)
diff --git a/libclc/clc/lib/r600/SOURCES b/libclc/clc/lib/r600/SOURCES
index 9185bcf7f390e..8f66107e0454e 100644
--- a/libclc/clc/lib/r600/SOURCES
+++ b/libclc/clc/lib/r600/SOURCES
@@ -1,2 +1 @@
math/clc_rsqrt_override.cl
-
>From fa3797064cd6073785ee7f68894f9d765708c08e Mon Sep 17 00:00:00 2001
From: Fraser Cormack <fraser at codeplay.com>
Date: Thu, 27 Feb 2025 15:04:50 +0000
Subject: [PATCH 3/3] use elementwise sqrt builtin and contract
---
libclc/clc/lib/generic/math/clc_rsqrt.cl | 1 -
libclc/clc/lib/generic/math/clc_rsqrt.inc | 3 ++-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/libclc/clc/lib/generic/math/clc_rsqrt.cl b/libclc/clc/lib/generic/math/clc_rsqrt.cl
index 18282e44f6dc6..b7a72e90850c9 100644
--- a/libclc/clc/lib/generic/math/clc_rsqrt.cl
+++ b/libclc/clc/lib/generic/math/clc_rsqrt.cl
@@ -21,7 +21,6 @@
*/
#include <clc/internal/clc.h>
-#include <clc/math/clc_sqrt.h>
#define __CLC_BODY <clc_rsqrt.inc>
#include <clc/math/gentype.inc>
diff --git a/libclc/clc/lib/generic/math/clc_rsqrt.inc b/libclc/clc/lib/generic/math/clc_rsqrt.inc
index a4d2146887876..88e1ce3e3b3fb 100644
--- a/libclc/clc/lib/generic/math/clc_rsqrt.inc
+++ b/libclc/clc/lib/generic/math/clc_rsqrt.inc
@@ -1,4 +1,5 @@
__attribute__((weak)) _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE
__clc_rsqrt(__CLC_GENTYPE val) {
- return __CLC_FP_LIT(1.0) / __clc_sqrt(val);
+#pragma clang fp contract(fast)
+ return __CLC_FP_LIT(1.0) / __builtin_elementwise_sqrt(val);
}
More information about the cfe-commits
mailing list