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 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
// SPDX-License-Identifier: BSD-2-Clause
/* Copyright (C) 2014 - 2021 Intel Corporation. */
#include "perf_tests.hpp"
#include <cmath>
#include <gtest/gtest.h>
#include <iostream>
// Memkind performance tests
using std::abs;
using std::cout;
using std::endl;
using std::ostringstream;
// Memkind tests
class PerformanceTest: public testing::Test
{
protected:
const double Tolerance = 0.15;
const double Confidence = 0.10;
Metrics referenceMetrics;
Metrics performanceMetrics;
PerfTestCase<performance_tests::MallocOperation> referenceTest;
PerfTestCase<performance_tests::MemkindOperation> performanceTest;
template <class T>
static void RecordProperty(const string &key, const T value)
{
ostringstream values;
values << value;
testing::Test::RecordProperty(key, values.str());
}
void SetUp()
{}
void TearDown()
{}
bool checkDelta(double value, double reference, const string &info,
double delta, bool higherIsBetter = false)
{
// If higherIsBetter is true, current value should be >= (reference -
// delta); otherwise, it should be <= (reference + delta)
double threshold =
higherIsBetter ? reference * (1 - delta) : reference * (1 + delta);
cout << "Metric: " << info << ". Reference value: " << reference
<< ". "
"Expected: "
<< (higherIsBetter ? ">= " : "<= ") << threshold
<< " (delta = " << delta
<< ")."
"Actual: "
<< value << " (delta = "
<< ((value > reference ? (value / reference)
: (reference / value)) -
1.0) /
((higherIsBetter != (value > reference)) ? 1.0 : -1.0)
<< ")." << endl;
if (higherIsBetter ? (value <= threshold) : (value >= threshold)) {
cout << "WARNING : Value of '" << info
<< "' outside expected bounds!" << endl;
return false;
}
return true;
}
bool compareMetrics(Metrics metrics, Metrics reference, double delta)
{
bool result = true;
result &= checkDelta(metrics.operationsPerSecond,
reference.operationsPerSecond,
"operationsPerSecond", delta, true);
result &= checkDelta(metrics.avgOperationDuration,
reference.avgOperationDuration,
"avgOperationDuration", delta);
return result;
}
void writeMetrics(Metrics metrics, Metrics reference)
{
RecordProperty("ops_per_sec", metrics.operationsPerSecond);
RecordProperty(
"ops_per_sec_vs_ref",
(reference.operationsPerSecond - metrics.operationsPerSecond) *
100.0f / reference.operationsPerSecond);
RecordProperty("avg_op_time_nsec", metrics.avgOperationDuration);
RecordProperty(
"avg_op_time_nsec_vs_ref",
(metrics.avgOperationDuration - reference.avgOperationDuration) *
100.0f / reference.avgOperationDuration);
}
void run()
{
cout << "Running reference std::malloc test" << endl;
referenceMetrics = referenceTest.runTest();
cout << "Running memkind test" << endl;
performanceMetrics = performanceTest.runTest();
writeMetrics(performanceMetrics, referenceMetrics);
EXPECT_TRUE(compareMetrics(performanceMetrics, referenceMetrics,
Tolerance + Confidence));
}
};
TEST_F(PerformanceTest, test_TC_MEMKIND_perf_single_op_single_iter)
{
referenceTest.setupTest_singleOpSingleIter();
performanceTest.setupTest_singleOpSingleIter();
run();
}
TEST_F(PerformanceTest, test_TC_MEMKIND_perf_many_ops_single_iter)
{
referenceTest.setupTest_manyOpsSingleIter();
performanceTest.setupTest_manyOpsSingleIter();
run();
}
TEST_F(PerformanceTest, test_TC_MEMKIND_perf_many_ops_single_iter_huge_alloc)
{
referenceTest.setupTest_manyOpsSingleIterHugeAlloc();
performanceTest.setupTest_manyOpsSingleIterHugeAlloc();
run();
}
TEST_F(PerformanceTest, test_TC_MEMKIND_perf_single_op_many_iters)
{
referenceTest.setupTest_singleOpManyIters();
performanceTest.setupTest_singleOpManyIters();
run();
}
TEST_F(PerformanceTest, test_TC_MEMKIND_perf_many_ops_many_iters)
{
referenceTest.setupTest_manyOpsManyIters();
performanceTest.setupTest_manyOpsManyIters();
run();
}
TEST_F(PerformanceTest, test_TC_MEMKIND_perf_many_ops_many_iters_many_kinds)
{
referenceTest.setupTest_manyOpsManyIters();
performanceTest.setupTest_manyOpsManyIters();
run();
}
|