Ciao John Gartell,

Il 2022-02-25 17:06 John Gatrell ha scritto:
Hi everyone. I'm new here so I don't know how to submit a new gmp-impl.h

This list is the correct place for such a discussion.

I tested using UHWtype in the macro for binvert_limb. On a 64 bit machine one of my programs gained a 3% speedup. On a 32 bit machine, there was no

Unfortunately, on different platforms, we have different speeds.
Should we use uint8_fast_t, uint16_fast_t, uint32_fast_t for the different levels, and let the compiler choose? :-D

Anyway, if you are curious, you can also try what happens with a table-lookup-free binvert_limb function. You can find it, named sec_binvert_limb, in the file mpn/generic/sec_powm.c .

There are also architectures where smaller operations are NOT faster, but, on the other side, more than one mul instruction can run concurrently. For those architectures I'd suggest the following, any couple of multiplications beyond the 32-bits limit can be computed in parallel.

#define binvert_limb(inv,n) \ do { \ mp_limb_t __n = (n); \ mp_limb_t __inv; \ ASSERT ((__n & 1) == 1); \ \ __inv = binvert_limb_table[(__n/2) & 0x7F]; /* 8 */ \ if (GMP_NUMB_BITS <= 32) \ { \ if (GMP_NUMB_BITS > 8) \ __inv = 2 * __inv - __inv * __inv * __n; \ if (GMP_NUMB_BITS > 16) \ __inv = 2 * __inv - __inv * __inv * __n; \ } \ else \ { \ mp_limb_t __t, __t2, __p; \ int __invbits = 32; \ __t = __n * __inv - 1; /* x */ \ __t2= __t * __t; /* x^2 */ \ __p = __inv * (__t - __t2); /* (1-x^2)x/(x+1) */ \ \ while (__invbits < GMP_NUMB_BITS - 8) \ { \ __p *= __t2 + 1; /* (1-x^{2^n})x/(x+1) */ \ __t2 *= __t2; /* x^{2^n} */ \ __invbits <<= 1; \ } \ /* __inv * (x^{2^{n+2}+1}-1)/(x+1) */ \ __inv -= __p * (__t2 + 1); \ } \ \ ASSERT ((__inv * __n & GMP_NUMB_MASK) == 1); \ (inv) = __inv & GMP_NUMB_MASK; \
  } while (0)

In any case, for 64-bits machines, all the described functions use 6 multiplications :-) but with very different paths toward the desired result! :-D

Maybe you can try them on your platform... and tell us exactly which CPU are you using for your tests, and how do they behave.

Ĝis,
m
_______________________________________________
gmp-devel mailing list
gmp-devel@gmplib.org
https://gmplib.org/mailman/listinfo/gmp-devel

Reply via email to