Each Intel® oneAPI Math Kernel Library (oneMKL) domain defines a preprocessor macro to represent the version of the specification that the implementation is compliant with, in accordance with the oneMATH specification.
The macros for each domain are listed as follows:
ONEMATH_BLAS_SPEC_VERSION
ONEMATH_LAPACK_SPEC_VERSION
ONEMATH_SPBLAS_SPEC_VERSION
ONEMATH_DFT_SPEC_VERSION
ONEMATH_RNG_SPEC_VERSION
ONEMATH_STATS_SPEC_VERSION
ONEMATH_VM_SPEC_VERSION
To support modern C++ usage, we also add constexpr of type SpecVersion for each domain in oneapi/mkl/<domain>/spec.hpp:
oneapi::mkl::blas::spec_version
oneapi::mkl::lapack::spec_version
oneapi::mkl::sparse::spec_version
oneapi::mkl::dft::spec_version
oneapi::mkl::rng::spec_version
oneapi::mkl::stats::spec_version
oneapi::mkl::vm::spec_version
To simplify version comparison, we add version enums in include/oneapi/mkl/spec.hpp:
enum class SpecVersion{
not_compliant = 1,
version_1_1 = 101,
version_1_2 = 102,
version_1_3 = 103,
version_1_4 = 104,
not_released
};
#include <oneapi/mkl/spec.hpp> // or mkl.hpp
#define MY_THRESHOLD_VERSION 102
#ifdef ONEMATH_BLAS_SPEC_VERSION
#if ONEMATH_BLAS_SPEC_VERSION > MY_THRESHOLD_VERSION
#define my_call call_optimization_A
#elif ONEMATH_BLAS_SPEC_VERSION > 001
#define my_call call_optimization_B
#else
#define my_call call_reference
#endif
#else
#define my_call call_reference
#endif
int main(){
my_call();
return 0;
}
#include <oneapi/mkl/spec.hpp> // or mkl.hpp
using namespace oneapi::mkl;
int main(){
SpecVersion my_threshold_version = SpecVersion::version_1_2;
if (oneapi::mkl::blas::spec_version > my_threshold_version)
call_optimization_A(); // App's optimization for new spec
else if (oneapi::mkl::blas::spec_version > SpecVersion::not_compliant)
call_optimization_B(); // App's optimization for old spec
else
call_reference(); // App's reference implementation
return 0;
}