mirror of
https://github.com/amd/blis.git
synced 2026-05-04 06:21:12 +00:00
Introducing upgrated BLIS GTestSuite.
Key features: - able to test both static and dynamic libraries - able to test BLAS, CBLAS and BLIS-typed interface - can use any CBLAS library for reference results - can build and/or run tests depending on the BLAS level or a specific API AMD-Internal: [CPUPL-2732] Change-Id: Ibe0d7938e06081526bbc54d3182ac7d17affdaf6
This commit is contained in:
67
gtestsuite/testinghelpers/inc/common/error_helpers.h
Normal file
67
gtestsuite/testinghelpers/inc/common/error_helpers.h
Normal file
@@ -0,0 +1,67 @@
|
||||
#pragma once
|
||||
|
||||
#include <limits>
|
||||
#include "common/type_info.h"
|
||||
|
||||
namespace testinghelpers {
|
||||
|
||||
/**
|
||||
* @brief Returns the value of machine epsilon depending on the type.
|
||||
* For scomplex and dcomplex, returns the value of machine epsilon
|
||||
* for float and double, respectively.
|
||||
* Epsilon is used as the basis for setting the threshold used for
|
||||
* SUCCESS or FAILURE of tests.
|
||||
*/
|
||||
template<typename T>
|
||||
double getEpsilon()
|
||||
{
|
||||
using RT = typename testinghelpers::type_info<T>::real_type;
|
||||
double eps = std::numeric_limits<RT>::epsilon();
|
||||
return eps;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Returns the relative error. Relative error is used in most cases since
|
||||
* it takes into account the magnitude of the exact and approx.
|
||||
* For the cases where we are comparing very small values, that is values
|
||||
* which are approximately zero, division with zero will cause inf/NaN.
|
||||
* For example, if exact=0 and approx=0, getRelativeError() would return -NaN.
|
||||
*/
|
||||
template<typename T>
|
||||
double getRelativeError(T exact, T approx)
|
||||
{
|
||||
double rel_err;
|
||||
rel_err = std::abs(exact - approx)/std::abs(exact);
|
||||
return rel_err;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Returns the absolute error. Absolute error is used for the cases where
|
||||
* we are comparing very small values, where relative error cannot be used.
|
||||
* For example, on the example above where exact=0 and approx=0,
|
||||
* getAbsoluteError() would return 0.
|
||||
*
|
||||
* Absolute error doesn't take into account magnitude which means that for
|
||||
* large values this could give false negatives.
|
||||
* For example, if T is float, exact=598320.943 and approx=598320.9431,
|
||||
* getAbsoluteError() would return 0.0001, compared to the relative error of ~2e-10.
|
||||
*/
|
||||
template<typename T>
|
||||
double getAbsoluteError(T exact, T approx)
|
||||
{
|
||||
double abs_err;
|
||||
abs_err = std::abs(exact - approx);
|
||||
return abs_err;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
double getError(T exact, T approx)
|
||||
{
|
||||
if ( std::abs(exact) > 1 )
|
||||
return getRelativeError(exact, approx);
|
||||
else
|
||||
return getAbsoluteError(exact, approx);
|
||||
}
|
||||
|
||||
|
||||
} // end of testinghelpers namespace
|
||||
Reference in New Issue
Block a user