VectorMath.cpp 5.61 KB
Newer Older
Gerard Ryan's avatar
Gerard Ryan committed
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
/*
 * @author  TPOC: palisade@njit.edu
 *
 * @copyright Copyright (c) 2017, New Jersey Institute of Technology (NJIT)
 * All rights reserved.
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 * 1. Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice, this
 * list of conditions and the following disclaimer in the documentation and/or other
 * materials provided with the distribution.
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */
/*
  This code benchmarks functions of the math directory  of the PALISADE lattice encryption library.
 */
#include "benchmark/benchmark_api.h"

#include "AllBackends.h"

#include <iostream>

#include "vechelper.h"

#include "lattice/elemparams.cpp"
#include "lattice/ilparams.cpp"
#include "lattice/ildcrtparams.cpp"
#include "lattice/poly.cpp"
#include "lattice/dcrtpoly.cpp"
#include "math/nbtheory.cpp"
#include "math/transfrm.cpp"
#include "math/discreteuniformgenerator.cpp"
#include "math/discretegaussiangenerator.cpp"
#include "lattice/elemparamfactory.h"

using namespace std;
using namespace lbcrypto;

#define DO_NATIVEVECTOR_BENCHMARK(X) \
		BENCHMARK_TEMPLATE(X,NativeVector)->Unit(benchmark::kMicrosecond)->ArgName("parm_16")->Arg(16); \
		BENCHMARK_TEMPLATE(X,NativeVector)->Unit(benchmark::kMicrosecond)->ArgName("parm_1024")->Arg(1024); \
		BENCHMARK_TEMPLATE(X,NativeVector)->Unit(benchmark::kMicrosecond)->ArgName("parm_2048")->Arg(2048);

#define DO_VECTOR_BENCHMARK_TEMPLATE(X,Y) \
		BENCHMARK_TEMPLATE(X,Y)->Unit(benchmark::kMicrosecond)->ArgName("parm_16")->Arg(16); \
		BENCHMARK_TEMPLATE(X,Y)->Unit(benchmark::kMicrosecond)->ArgName("parm_1024")->Arg(1024); \
		BENCHMARK_TEMPLATE(X,Y)->Unit(benchmark::kMicrosecond)->ArgName("parm_2048")->Arg(2048); \
		/*BENCHMARK_TEMPLATE(X,Y)->Unit(benchmark::kMicrosecond)->ArgName("parm_4096")->Arg(4096);*/ \
		BENCHMARK_TEMPLATE(X,Y)->Unit(benchmark::kMicrosecond)->ArgName("parm_8192")->Arg(8192); \
		/*BENCHMARK_TEMPLATE(X,Y)->Unit(benchmark::kMicrosecond)->ArgName("parm_16384")->Arg(16384);*/ \
		BENCHMARK_TEMPLATE(X,Y)->Unit(benchmark::kMicrosecond)->ArgName("parm_32768")->Arg(32768);

// add
template <typename V>
static void add_BigVec(const V& a, const V& b) {
	V c = a+b;
}

template <typename V>
static void BM_BigVec_Add(benchmark::State& state) { // benchmark
	auto p = state.range(0);
	size_t idx = ElemParamFactory::GetNearestIndex(p);
	typename V::Integer q( ElemParamFactory::DefaultSet[idx].q);
	V a = makeVector<V>(p, q);
	V b = makeVector<V>(p, q);

	while (state.KeepRunning()) {
		add_BigVec<V>(a,b);
	}
}

DO_NATIVEVECTOR_BENCHMARK(BM_BigVec_Add)
Gerard Ryan's avatar
Gerard Ryan committed
84 85 86
DO_VECTOR_BENCHMARK_TEMPLATE(BM_BigVec_Add, M2Vector)
DO_VECTOR_BENCHMARK_TEMPLATE(BM_BigVec_Add, M4Vector)
DO_VECTOR_BENCHMARK_TEMPLATE(BM_BigVec_Add, M6Vector)
Gerard Ryan's avatar
Gerard Ryan committed
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107

// +=
template <typename V>
static void addeq_BigVec(V& a, const V& b) {
	a += b;
}

template <typename V>
static void BM_BigVec_Addeq(benchmark::State& state) { // benchmark
	auto p = state.range(0);
	size_t idx = ElemParamFactory::GetNearestIndex(p);
	typename V::Integer q( ElemParamFactory::DefaultSet[idx].q);
	V b = makeVector<V>(p, q);

	while (state.KeepRunning()) {
		V a = makeVector<V>(p, q);
		addeq_BigVec<V>(a,b);
	}
}

DO_NATIVEVECTOR_BENCHMARK(BM_BigVec_Addeq)
Gerard Ryan's avatar
Gerard Ryan committed
108 109 110
DO_VECTOR_BENCHMARK_TEMPLATE(BM_BigVec_Addeq, M2Vector)
DO_VECTOR_BENCHMARK_TEMPLATE(BM_BigVec_Addeq, M4Vector)
DO_VECTOR_BENCHMARK_TEMPLATE(BM_BigVec_Addeq, M6Vector)
Gerard Ryan's avatar
Gerard Ryan committed
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131

// mult
template <typename V>
static void mult_BigVec(const V& a, const V& b) {	// function
	V c = a*b;
}

template <typename V>
static void BM_BigVec_Mult(benchmark::State& state) { // benchmark
	auto p = state.range(0);
	size_t idx = ElemParamFactory::GetNearestIndex(p);
	typename V::Integer q( ElemParamFactory::DefaultSet[idx].q);
	V a = makeVector<V>(p, q);
	V b = makeVector<V>(p, q);

	while (state.KeepRunning()) {
		mult_BigVec<V>(a, b);
	}
}

DO_NATIVEVECTOR_BENCHMARK(BM_BigVec_Mult)
Gerard Ryan's avatar
Gerard Ryan committed
132 133 134
DO_VECTOR_BENCHMARK_TEMPLATE(BM_BigVec_Mult, M2Vector)
DO_VECTOR_BENCHMARK_TEMPLATE(BM_BigVec_Mult, M4Vector)
DO_VECTOR_BENCHMARK_TEMPLATE(BM_BigVec_Mult, M6Vector)
Gerard Ryan's avatar
Gerard Ryan committed
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155

// mult
template <typename V>
static void multeq_BigVec(V& a, const V& b) {
	a *= b;
}

template <typename V>
static void BM_BigVec_Multeq(benchmark::State& state) { // benchmark
	auto p = state.range(0);
	size_t idx = ElemParamFactory::GetNearestIndex(p);
	typename V::Integer q( ElemParamFactory::DefaultSet[idx].q);
	V b = makeVector<V>(p, q);

	while (state.KeepRunning()) {
		V a = makeVector<V>(p, q);
		multeq_BigVec<V>(a,b);
	}
}

DO_NATIVEVECTOR_BENCHMARK(BM_BigVec_Multeq)
Gerard Ryan's avatar
Gerard Ryan committed
156 157 158
DO_VECTOR_BENCHMARK_TEMPLATE(BM_BigVec_Multeq, M2Vector)
DO_VECTOR_BENCHMARK_TEMPLATE(BM_BigVec_Multeq, M4Vector)
DO_VECTOR_BENCHMARK_TEMPLATE(BM_BigVec_Multeq, M6Vector)
Gerard Ryan's avatar
Gerard Ryan committed
159 160 161

//execute the benchmarks
BENCHMARK_MAIN()