mirror of
https://github.com/monero-project/monero.git
synced 2024-11-17 16:27:39 +00:00
multiexp: tune which variants to use for which number of points
This commit is contained in:
parent
8b4767221c
commit
a110e6aa18
2 changed files with 30 additions and 14 deletions
|
@ -48,7 +48,7 @@ extern "C"
|
||||||
|
|
||||||
#define PERF_TIMER_START_BP(x) PERF_TIMER_START_UNIT(x, 1000000)
|
#define PERF_TIMER_START_BP(x) PERF_TIMER_START_UNIT(x, 1000000)
|
||||||
|
|
||||||
#define STRAUS_SIZE_LIMIT 128
|
#define STRAUS_SIZE_LIMIT 232
|
||||||
#define PIPPENGER_SIZE_LIMIT 0
|
#define PIPPENGER_SIZE_LIMIT 0
|
||||||
|
|
||||||
namespace rct
|
namespace rct
|
||||||
|
@ -77,11 +77,11 @@ static inline rct::key multiexp(const std::vector<MultiexpData> &data, size_t Hi
|
||||||
{
|
{
|
||||||
if (HiGi_size > 0)
|
if (HiGi_size > 0)
|
||||||
{
|
{
|
||||||
static_assert(128 <= STRAUS_SIZE_LIMIT, "Straus in precalc mode can only be calculated till STRAUS_SIZE_LIMIT");
|
static_assert(232 <= STRAUS_SIZE_LIMIT, "Straus in precalc mode can only be calculated till STRAUS_SIZE_LIMIT");
|
||||||
return HiGi_size <= 128 && data.size() == HiGi_size ? straus(data, straus_HiGi_cache, 0) : pippenger(data, pippenger_HiGi_cache, HiGi_size, get_pippenger_c(data.size()));
|
return HiGi_size <= 232 && data.size() == HiGi_size ? straus(data, straus_HiGi_cache, 0) : pippenger(data, pippenger_HiGi_cache, HiGi_size, get_pippenger_c(data.size()));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return data.size() <= 64 ? straus(data, NULL, 0) : pippenger(data, NULL, 0, get_pippenger_c(data.size()));
|
return data.size() <= 95 ? straus(data, NULL, 0) : pippenger(data, NULL, 0, get_pippenger_c(data.size()));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool is_reduced(const rct::key &scalar)
|
static inline bool is_reduced(const rct::key &scalar)
|
||||||
|
|
|
@ -79,6 +79,25 @@ extern "C"
|
||||||
// Best/cached Straus Straus Straus Straus Straus Straus Straus Straus Pip Pip Pip Pip
|
// Best/cached Straus Straus Straus Straus Straus Straus Straus Straus Pip Pip Pip Pip
|
||||||
// Best/uncached Straus Straus Straus Straus Straus Straus Pip Pip Pip Pip Pip Pip
|
// Best/uncached Straus Straus Straus Straus Straus Straus Pip Pip Pip Pip Pip Pip
|
||||||
|
|
||||||
|
// New timings:
|
||||||
|
// Pippenger:
|
||||||
|
// 2/1 always
|
||||||
|
// 3/2 at ~13
|
||||||
|
// 4/3 at ~29
|
||||||
|
// 5/4 at ~83
|
||||||
|
// 6/5 < 200
|
||||||
|
// 7/6 at ~470
|
||||||
|
// 8/7 at ~1180
|
||||||
|
// 9/8 at ~2290
|
||||||
|
// Cached Pippenger:
|
||||||
|
// 6/5 < 200
|
||||||
|
// 7/6 at 460
|
||||||
|
// 8/7 at 1180
|
||||||
|
// 9/8 at 2300
|
||||||
|
//
|
||||||
|
// Cached Straus/Pippenger cross at 232
|
||||||
|
//
|
||||||
|
|
||||||
namespace rct
|
namespace rct
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -543,16 +562,13 @@ skipfirst:
|
||||||
|
|
||||||
size_t get_pippenger_c(size_t N)
|
size_t get_pippenger_c(size_t N)
|
||||||
{
|
{
|
||||||
// uncached: 2:1, 4:2, 8:2, 16:3, 32:4, 64:4, 128:5, 256:6, 512:7, 1024:7, 2048:8, 4096:9
|
if (N <= 13) return 2;
|
||||||
// cached: 2:1, 4:2, 8:2, 16:3, 32:4, 64:4, 128:5, 256:6, 512:7, 1024:7, 2048:8, 4096:9
|
if (N <= 29) return 3;
|
||||||
if (N <= 2) return 1;
|
if (N <= 83) return 4;
|
||||||
if (N <= 8) return 2;
|
if (N <= 185) return 5;
|
||||||
if (N <= 16) return 3;
|
if (N <= 465) return 6;
|
||||||
if (N <= 64) return 4;
|
if (N <= 1180) return 7;
|
||||||
if (N <= 128) return 5;
|
if (N <= 2295) return 8;
|
||||||
if (N <= 256) return 6;
|
|
||||||
if (N <= 1024) return 7;
|
|
||||||
if (N <= 2048) return 8;
|
|
||||||
return 9;
|
return 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue