aboutsummaryrefslogtreecommitdiffstats
path: root/sample/bench.cpp
blob: 1f264aea672f2dbd83eab9a3a6ec0c1abd56d77f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <cybozu/benchmark.hpp>
#include <cybozu/option.hpp>
#include <mcl/fp.hpp>

typedef mcl::FpT<> Fp;

void benchFpSub(const char *pStr, const char *xStr, const char *yStr, mcl::fp::Mode mode)
{
    Fp::setModulo(pStr, 0, mode);
    Fp x(xStr);
    Fp y(yStr);

    double addT, subT, mulT, invT;
    CYBOZU_BENCH_T(addT, Fp::add, x, x, x);
    CYBOZU_BENCH_T(subT, Fp::sub, x, x, y);
    CYBOZU_BENCH_T(mulT, Fp::mul, x, x, x);
    CYBOZU_BENCH_T(invT, x += y;Fp::inv, x, x); // avoid same jmp
    printf("bit % 3d add %8.2f sub %8.2f mul %8.2f inv %8.2f\n", (int)Fp::getBitSize(), addT, subT, mulT, invT);
}

void benchFp(size_t bitSize, int imode)
{
    const struct {
        size_t bitSize;
        const char *p;
        const char *x;
        const char *y;
    } tbl[] = {
        {
            192,
            "0xfffffffffffffffffffffffe26f2fc170f69466a74defd8d",
            "0x148094810948190412345678901234567900342423332197",
            "0x7fffffffffffffffffffffe26f2fc170f69466a74defd8d",
        },
        {
            256,
            "0x2523648240000001ba344d80000000086121000000000013a700000000000013",
            "0x1480948109481904123456789234234242423424201234567900342423332197",
            "0x151342342342341517fffffffffffffffffffffe26f2fc170f69466a74defd8d",
        },
        {
            384,
            "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
            "0x19481084109481094820948209482094820984290482212345678901234567900342308472047204720422423332197",
            "0x209348209481094820984209842094820948204204243123456789012345679003423084720472047204224233321972",
            
        },
        {
            521,
            "0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
            "0x2908209582095820941098410948109482094820984209840294829049240294242498540975555312345678901234567900342308472047204720422423332197",
            "0x3948384209834029834092384204920349820948205872380573205782385729385729385723985837ffffffffffffffffffffffe26f2fc170f69466a74defd8d",

        },
    };
    for (size_t i = 0; i < CYBOZU_NUM_OF_ARRAY(tbl); i++) {
        if (bitSize != 0 && tbl[i].bitSize != bitSize) continue;
        benchFpSub(tbl[i].p, tbl[i].x, tbl[i].y, mcl::fp::FP_AUTO);
        benchFpSub(tbl[i].p, tbl[i].x, tbl[i].y, mcl::fp::FP_LLVM);
        benchFpSub(tbl[i].p, tbl[i].x, tbl[i].y, mcl::fp::FP_LLVM_MONT);
        benchFpSub(tbl[i].p, tbl[i].x, tbl[i].y, mcl::fp::FP_XBYAK);
    }
}

void benchEc(size_t, int)
{
}

int main(int argc, char *argv[])
    try
{
    size_t bitSize;
    int mode;
    bool ecOnly;
    bool fpOnly;
    cybozu::Option opt;
    opt.appendOpt(&bitSize, 0, "b", ": bitSize");
    opt.appendOpt(&mode, 0, "m", ": mode(0:auto, 1:llvm, 2:llvm+mont, 3:xbyak");
    opt.appendBoolOpt(&ecOnly, "ec", ": ec only");
    opt.appendBoolOpt(&fpOnly, "fp", ": fp only");
    opt.appendHelp("h", ": show this message");
    if (!opt.parse(argc, argv)) {
        opt.usage();
        exit(1);
    }
    if (mode < 0 || mode > 3) {
        printf("bad mode %d\n", mode);
        opt.usage();
        exit(1);
    }
    if (!ecOnly) benchFp(bitSize, mode);
    if (!fpOnly) benchEc(bitSize, mode);
} catch (std::exception& e) {
    printf("ERR %s\n", e.what());
}