|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
#if defined(CAFFE2_PERF_WITH_SVE) || defined(CAFFE2_PERF_WITH_AVX512) || \
|
|
|
defined(CAFFE2_PERF_WITH_AVX2) || defined(CAFFE2_PERF_WITH_AVX)
|
|
|
#include <cpuinfo.h>
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define BASE_DO(funcname, ...) return funcname##__base(__VA_ARGS__);
|
|
|
|
|
|
#ifdef CAFFE2_PERF_WITH_SVE
|
|
|
#define SVE_DO(funcname, ...) \
|
|
|
{ \
|
|
|
static const bool isDo = cpuinfo_initialize() && cpuinfo_has_arm_sve(); \
|
|
|
if (isDo) { \
|
|
|
return funcname##__sve(__VA_ARGS__); \
|
|
|
} \
|
|
|
}
|
|
|
#else
|
|
|
#define SVE_DO(funcname, ...)
|
|
|
#endif
|
|
|
|
|
|
#ifdef CAFFE2_PERF_WITH_AVX512
|
|
|
#define AVX512_DO(funcname, ...) \
|
|
|
{ \
|
|
|
static const bool isDo = cpuinfo_initialize() && \
|
|
|
cpuinfo_has_x86_avx512f() && cpuinfo_has_x86_avx512dq() && \
|
|
|
cpuinfo_has_x86_avx512vl(); \
|
|
|
if (isDo) { \
|
|
|
return funcname##__avx512(__VA_ARGS__); \
|
|
|
} \
|
|
|
}
|
|
|
#else
|
|
|
#define AVX512_DO(funcname, ...)
|
|
|
#endif
|
|
|
|
|
|
#ifdef CAFFE2_PERF_WITH_AVX2
|
|
|
#define AVX2_DO(funcname, ...) \
|
|
|
{ \
|
|
|
static const bool isDo = cpuinfo_initialize() && cpuinfo_has_x86_avx2(); \
|
|
|
if (isDo) { \
|
|
|
return funcname##__avx2(__VA_ARGS__); \
|
|
|
} \
|
|
|
}
|
|
|
#define AVX2_FMA_DO(funcname, ...) \
|
|
|
{ \
|
|
|
static const bool isDo = cpuinfo_initialize() && cpuinfo_has_x86_avx2() && \
|
|
|
cpuinfo_has_x86_fma3(); \
|
|
|
if (isDo) { \
|
|
|
return funcname##__avx2_fma(__VA_ARGS__); \
|
|
|
} \
|
|
|
}
|
|
|
#else
|
|
|
#define AVX2_DO(funcname, ...)
|
|
|
#define AVX2_FMA_DO(funcname, ...)
|
|
|
#endif
|
|
|
|
|
|
#ifdef CAFFE2_PERF_WITH_AVX
|
|
|
#define AVX_DO(funcname, ...) \
|
|
|
{ \
|
|
|
static const bool isDo = cpuinfo_initialize() && cpuinfo_has_x86_avx(); \
|
|
|
if (isDo) { \
|
|
|
return funcname##__avx(__VA_ARGS__); \
|
|
|
} \
|
|
|
}
|
|
|
#define AVX_F16C_DO(funcname, ...) \
|
|
|
{ \
|
|
|
static const bool isDo = cpuinfo_initialize() && cpuinfo_has_x86_avx() && \
|
|
|
cpuinfo_has_x86_f16c(); \
|
|
|
if (isDo) { \
|
|
|
return funcname##__avx_f16c(__VA_ARGS__); \
|
|
|
} \
|
|
|
}
|
|
|
#else
|
|
|
#define AVX_DO(funcname, ...)
|
|
|
#define AVX_F16C_DO(funcname, ...)
|
|
|
#endif
|
|
|
|