From b144ffcad24240677cc98807b8a03aaae9dd4e3e Mon Sep 17 00:00:00 2001 From: MITSUNARI Shigeo Date: Thu, 24 Oct 2024 18:07:44 +0900 Subject: [PATCH] mulEach is 1.1 times faster --- src/asm/bint-x64-amd64.S | 84 ++++++++++------------------------------ src/avx512.hpp | 8 ++++ src/gen_bint_x64.py | 16 +------- src/msm_avx.cpp | 17 +++++++- 4 files changed, 47 insertions(+), 78 deletions(-) diff --git a/src/asm/bint-x64-amd64.S b/src/asm/bint-x64-amd64.S index 41130767..fe409870 100644 --- a/src/asm/bint-x64-amd64.S +++ b/src/asm/bint-x64-amd64.S @@ -666,34 +666,20 @@ ret .balign 32 .L2: vpmadd52luq (%rax), %zmm11, %zmm0 -vpxorq %zmm10, %zmm10, %zmm10 -vpmadd52huq (%rax), %zmm11, %zmm10 +vpmadd52huq (%rax), %zmm11, %zmm1 vpmadd52luq 64(%rax), %zmm11, %zmm1 -vpaddq %zmm10, %zmm1, %zmm1 -vpxorq %zmm10, %zmm10, %zmm10 -vpmadd52huq 64(%rax), %zmm11, %zmm10 +vpmadd52huq 64(%rax), %zmm11, %zmm2 vpmadd52luq 128(%rax), %zmm11, %zmm2 -vpaddq %zmm10, %zmm2, %zmm2 -vpxorq %zmm10, %zmm10, %zmm10 -vpmadd52huq 128(%rax), %zmm11, %zmm10 +vpmadd52huq 128(%rax), %zmm11, %zmm3 vpmadd52luq 192(%rax), %zmm11, %zmm3 -vpaddq %zmm10, %zmm3, %zmm3 -vpxorq %zmm10, %zmm10, %zmm10 -vpmadd52huq 192(%rax), %zmm11, %zmm10 +vpmadd52huq 192(%rax), %zmm11, %zmm4 vpmadd52luq 256(%rax), %zmm11, %zmm4 -vpaddq %zmm10, %zmm4, %zmm4 -vpxorq %zmm10, %zmm10, %zmm10 -vpmadd52huq 256(%rax), %zmm11, %zmm10 +vpmadd52huq 256(%rax), %zmm11, %zmm5 vpmadd52luq 320(%rax), %zmm11, %zmm5 -vpaddq %zmm10, %zmm5, %zmm5 -vpxorq %zmm10, %zmm10, %zmm10 -vpmadd52huq 320(%rax), %zmm11, %zmm10 +vpmadd52huq 320(%rax), %zmm11, %zmm6 vpmadd52luq 384(%rax), %zmm11, %zmm6 -vpaddq %zmm10, %zmm6, %zmm6 -vpxorq %zmm10, %zmm10, %zmm10 -vpmadd52huq 384(%rax), %zmm11, %zmm10 +vpmadd52huq 384(%rax), %zmm11, %zmm7 vpmadd52luq 448(%rax), %zmm11, %zmm7 -vpaddq %zmm10, %zmm7, %zmm7 vpmadd52huq 448(%rax), %zmm11, %zmm8 ret SIZE(mcl_c5_vmul) @@ -1220,62 +1206,34 @@ ret .L5: vpmadd52luq (%rax), %zmm21, %zmm0 vpmadd52luq 64(%rax), %zmm22, %zmm1 -vpxorq %zmm19, %zmm19, %zmm19 -vpxorq %zmm20, %zmm20, %zmm20 -vpmadd52huq (%rax), %zmm21, %zmm19 -vpmadd52huq 64(%rax), %zmm22, %zmm20 +vpmadd52huq (%rax), %zmm21, %zmm2 +vpmadd52huq 64(%rax), %zmm22, %zmm3 vpmadd52luq 128(%rax), %zmm21, %zmm2 vpmadd52luq 192(%rax), %zmm22, %zmm3 -vpaddq %zmm19, %zmm2, %zmm2 -vpaddq %zmm20, %zmm3, %zmm3 -vpxorq %zmm19, %zmm19, %zmm19 -vpxorq %zmm20, %zmm20, %zmm20 -vpmadd52huq 128(%rax), %zmm21, %zmm19 -vpmadd52huq 192(%rax), %zmm22, %zmm20 +vpmadd52huq 128(%rax), %zmm21, %zmm4 +vpmadd52huq 192(%rax), %zmm22, %zmm5 vpmadd52luq 256(%rax), %zmm21, %zmm4 vpmadd52luq 320(%rax), %zmm22, %zmm5 -vpaddq %zmm19, %zmm4, %zmm4 -vpaddq %zmm20, %zmm5, %zmm5 -vpxorq %zmm19, %zmm19, %zmm19 -vpxorq %zmm20, %zmm20, %zmm20 -vpmadd52huq 256(%rax), %zmm21, %zmm19 -vpmadd52huq 320(%rax), %zmm22, %zmm20 +vpmadd52huq 256(%rax), %zmm21, %zmm6 +vpmadd52huq 320(%rax), %zmm22, %zmm7 vpmadd52luq 384(%rax), %zmm21, %zmm6 vpmadd52luq 448(%rax), %zmm22, %zmm7 -vpaddq %zmm19, %zmm6, %zmm6 -vpaddq %zmm20, %zmm7, %zmm7 -vpxorq %zmm19, %zmm19, %zmm19 -vpxorq %zmm20, %zmm20, %zmm20 -vpmadd52huq 384(%rax), %zmm21, %zmm19 -vpmadd52huq 448(%rax), %zmm22, %zmm20 +vpmadd52huq 384(%rax), %zmm21, %zmm8 +vpmadd52huq 448(%rax), %zmm22, %zmm9 vpmadd52luq 512(%rax), %zmm21, %zmm8 vpmadd52luq 576(%rax), %zmm22, %zmm9 -vpaddq %zmm19, %zmm8, %zmm8 -vpaddq %zmm20, %zmm9, %zmm9 -vpxorq %zmm19, %zmm19, %zmm19 -vpxorq %zmm20, %zmm20, %zmm20 -vpmadd52huq 512(%rax), %zmm21, %zmm19 -vpmadd52huq 576(%rax), %zmm22, %zmm20 +vpmadd52huq 512(%rax), %zmm21, %zmm10 +vpmadd52huq 576(%rax), %zmm22, %zmm11 vpmadd52luq 640(%rax), %zmm21, %zmm10 vpmadd52luq 704(%rax), %zmm22, %zmm11 -vpaddq %zmm19, %zmm10, %zmm10 -vpaddq %zmm20, %zmm11, %zmm11 -vpxorq %zmm19, %zmm19, %zmm19 -vpxorq %zmm20, %zmm20, %zmm20 -vpmadd52huq 640(%rax), %zmm21, %zmm19 -vpmadd52huq 704(%rax), %zmm22, %zmm20 +vpmadd52huq 640(%rax), %zmm21, %zmm12 +vpmadd52huq 704(%rax), %zmm22, %zmm13 vpmadd52luq 768(%rax), %zmm21, %zmm12 vpmadd52luq 832(%rax), %zmm22, %zmm13 -vpaddq %zmm19, %zmm12, %zmm12 -vpaddq %zmm20, %zmm13, %zmm13 -vpxorq %zmm19, %zmm19, %zmm19 -vpxorq %zmm20, %zmm20, %zmm20 -vpmadd52huq 768(%rax), %zmm21, %zmm19 -vpmadd52huq 832(%rax), %zmm22, %zmm20 +vpmadd52huq 768(%rax), %zmm21, %zmm14 +vpmadd52huq 832(%rax), %zmm22, %zmm15 vpmadd52luq 896(%rax), %zmm21, %zmm14 vpmadd52luq 960(%rax), %zmm22, %zmm15 -vpaddq %zmm19, %zmm14, %zmm14 -vpaddq %zmm20, %zmm15, %zmm15 vpmadd52huq 896(%rax), %zmm21, %zmm16 vpmadd52huq 960(%rax), %zmm22, %zmm17 ret diff --git a/src/avx512.hpp b/src/avx512.hpp index d87a3479..7f81eabc 100644 --- a/src/avx512.hpp +++ b/src/avx512.hpp @@ -16,6 +16,14 @@ typedef __mmask8 Vmask; static const size_t vN = 2; // fixed struct VecA { Vec v[vN]; + VecA& operator=(const Vec& x) + { + v[0] = x; + v[1] = x; + return *this; + } + VecA() {} + VecA(const Vec& x) { v[0] = x; v[1] = x; } }; struct VmaskA { diff --git a/src/gen_bint_x64.py b/src/gen_bint_x64.py index 028339ce..0e83fb2e 100644 --- a/src/gen_bint_x64.py +++ b/src/gen_bint_x64.py @@ -350,13 +350,7 @@ def vmulUnit(z, px, y, N, H): def vmulUnitAdd(z, px, y, N, H): for i in range(0, N): vmulL(z[i], y, ptr(px+i*64)) - if i > 0: - vpaddq(z[i], z[i], H) - if i < N-1: - vpxorq(H, H, H) - vmulH(H, y, ptr(px+i*64)) - else: - vmulH(z[N], y, ptr(px+i*64)) + vmulH(z[i+1], y, ptr(px+i*64)) def shift(v, s): vmovdqa64(s, v[0]) @@ -465,13 +459,7 @@ def vmulUnitAddA(z, px, y, N, H): vN = 2 for i in range(0, N): un(vmulL)(z[i], y, ptr(px+i*64*vN)) - if i > 0: - un(vpaddq)(z[i], z[i], H) - if i < N-1: - un(vpxorq)(H, H, H) - un(vmulH)(H, y, ptr(px+i*64*vN)) - else: - un(vmulH)(z[N], y, ptr(px+i*64*vN)) + un(vmulH)(z[i+1], y, ptr(px+i*64*vN)) def shiftA(v, s): un = genUnrollFunc() diff --git a/src/msm_avx.cpp b/src/msm_avx.cpp index ac65e9f1..8218c8b4 100644 --- a/src/msm_avx.cpp +++ b/src/msm_avx.cpp @@ -237,6 +237,20 @@ template inline V vmulUnitAdd(V *z, const U *x, const V& y) { V H; +#if 1 + V v = x[0]; + z[0] = vmulL(v, y, z[0]); + H = vmulH(v, y, z[1]); + for (size_t i = 1; i < N-1; i++) { + v = x[i]; + z[i] = vmulL(v, y, H); + H = vmulH(v, y, z[i+1]); + } + v = x[N-1]; + z[N-1] = vmulL(v, y, H); + H = vmulH(v, y); + return H; +#else z[0] = vmulL(x[0], y, z[0]); H = vmulH(x[0], y); for (size_t i = 1; i < N; i++) { @@ -244,6 +258,7 @@ inline V vmulUnitAdd(V *z, const U *x, const V& y) H = vmulH(x[i], y); } return H; +#endif } template @@ -324,7 +339,7 @@ inline void vmul(V *z, const V *x, const U *y) uvselect(z, c, t+N, z); #endif } -#ifdef USE_ASM +#if defined(USE_ASM) && defined(__clang__) template<> inline void vmul(Vec *z, const Vec *x, const Vec *y) {