Skip to content

Commit

Permalink
mulEach is 1.1 times faster
Browse files Browse the repository at this point in the history
  • Loading branch information
herumi committed Oct 24, 2024
1 parent 7db1696 commit b144ffc
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 78 deletions.
84 changes: 21 additions & 63 deletions src/asm/bint-x64-amd64.S
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down
8 changes: 8 additions & 0 deletions src/avx512.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
16 changes: 2 additions & 14 deletions src/gen_bint_x64.py
Original file line number Diff line number Diff line change
Expand Up @@ -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])
Expand Down Expand Up @@ -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()
Expand Down
17 changes: 16 additions & 1 deletion src/msm_avx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -237,13 +237,28 @@ template<class V, class U>
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++) {
z[i] = vpaddq(vmulL(x[i], y, H), z[i]);
H = vmulH(x[i], y);
}
return H;
#endif
}

template<class V>
Expand Down Expand Up @@ -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)
{
Expand Down

0 comments on commit b144ffc

Please sign in to comment.