[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]);