[Hardware][Power] Add FAST_EXP for Power (#49571)
Signed-off-by: Akash kaothalkar <akash.kaothalkar@ibm.com> Co-authored-by: Akash kaothalkar <akash.kaothalkar@ibm.com>
Akash kaothalkar committed
Jul 27, 2026 at 11:17 UTC
f19ee27e39b20564109c124c40d8544cc1df24cc
3 files changed
+24
-4
benchmarks/kernels/cpu/benchmark_cpu_attn.py
+1
-1
@@ -154,7 +154,7 @@ def main(
154
scale=scale,
155
causal=True,
156
alibi_slopes=None,
157
- sliding_window=window_size,
157
+ sliding_window=window_size if sliding_window is not None else -1,
158
block_table=block_tables,
159
softcap=0,
160
scheduler_metadata=metadata,
csrc/cpu/cpu_arch_macros.h
+11
@@ -172,4 +172,15 @@
172
173
#endif // __riscv_v
174
175
+// Power VSX
176
+#ifdef __powerpc__
177
+ // FP32Vec16::exp() in cpu_types_vsx.hpp delegates to FP32Vec8::exp(), which
178
+ // implements a vectorised 5-term minimax polynomial using VSX intrinsics.
179
+ #define DEFINE_FAST_EXP \
180
+ auto fast_exp = [&](const vec_op::FP32Vec16& vec) \
181
+ __attribute__((always_inline)) { return vec.exp(); }; \
182
+ auto fast_exp_f16 = fast_exp;
183
+
184
+#endif // __powerpc__
185
+
186
#endif
csrc/cpu/cpu_types_vsx.hpp
+12
-3
@@ -287,7 +287,7 @@ struct FP32Vec4 : public Vec<FP32Vec4> {
287
288
explicit FP32Vec4(__vector float data) : reg(data) {}
289
290
- explicit FP32Vec4(const FP32Vec4& data) : reg(data.reg) {}
290
+ FP32Vec4(const FP32Vec4& data) : reg(data.reg) {}
291
};
292
293
struct FP32Vec8 : public Vec<FP32Vec8> {
@@ -316,7 +316,7 @@ struct FP32Vec8 : public Vec<FP32Vec8> {
316
317
explicit FP32Vec8(f32x4x2_t data) : reg(data) {}
318
319
- explicit FP32Vec8(const FP32Vec8& data) {
319
+ FP32Vec8(const FP32Vec8& data) {
320
reg.val[0] = data.reg.val[0];
321
reg.val[1] = data.reg.val[1];
322
}
@@ -593,7 +593,7 @@ struct FP32Vec16 : public Vec<FP32Vec16> {
593
explicit FP32Vec16(bool, const float* ptr) : FP32Vec16(ptr) {}
594
explicit FP32Vec16(f32x4x4_t data) : reg(data) {}
595
596
- explicit FP32Vec16(const FP32Vec16& data) {
596
+ FP32Vec16(const FP32Vec16& data) {
597
reg.val[0] = data.reg.val[0];
598
reg.val[1] = data.reg.val[1];
599
reg.val[2] = data.reg.val[2];
@@ -747,6 +747,15 @@ struct FP32Vec16 : public Vec<FP32Vec16> {
747
vec_abs(reg.val[2]), vec_abs(reg.val[3])}));
748
}
749
750
+ FP32Vec16 exp() const {
751
+ FP32Vec8 lo(f32x4x2_t{reg.val[0], reg.val[1]});
752
+ FP32Vec8 hi(f32x4x2_t{reg.val[2], reg.val[3]});
753
+ auto lo_e = lo.exp();
754
+ auto hi_e = hi.exp();
755
+ return FP32Vec16(f32x4x4_t{lo_e.reg.val[0], lo_e.reg.val[1],
756
+ hi_e.reg.val[0], hi_e.reg.val[1]});
757
+ }
758
+
759
float reduce_max() {
760
__vector float max01 = vec_max(reg.val[0], reg.val[1]);
761
__vector float max23 = vec_max(reg.val[2], reg.val[3]);