提交 917c9cc6 编写于 作者: L liaogang

Change interface and comments in Cpuid.cpp

上级 cb9ebeda
......@@ -51,7 +51,11 @@ SIMDFlags::SIMDFlags() {
simd_flags_ |= cpuInfo[2] & (1 << 16) ? SIMD_FMA4 : SIMD_NONE;
}
const SIMDFlags* SIMDFlags::instance() {
bool SIMDFlags::check(int flags) const {
return (simd_flags_ & flags) == flags;
}
SIMDFlags const* SIMDFlags::instance() {
static SIMDFlags instance;
return &instance;
}
......
......@@ -15,28 +15,7 @@ limitations under the License. */
namespace paddle {
class SIMDFlags final {
public:
DISABLE_COPY(SIMDFlags);
SIMDFlags();
static const SIMDFlags* instance();
inline bool isSSE() const { return simd_flags_ & SIMD_SSE; }
inline bool isSSE2() const { return simd_flags_ & SIMD_SSE2; }
inline bool isSSE3() const { return simd_flags_ & SIMD_SSE3; }
inline bool isSSSE3() const { return simd_flags_ & SIMD_SSSE3; }
inline bool isSSE41() const { return simd_flags_ & SIMD_SSE41; }
inline bool isSSE42() const { return simd_flags_ & SIMD_SSE42; }
inline bool isFMA3() const { return simd_flags_ & SIMD_FMA3; }
inline bool isFMA4() const { return simd_flags_ & SIMD_FMA4; }
inline bool isAVX() const { return simd_flags_ & SIMD_AVX; }
inline bool isAVX2() const { return simd_flags_ & SIMD_AVX2; }
inline bool isAVX512()const { return simd_flags_ & SIMD_AVX512;}
private:
enum simd_t {
enum simd_t {
SIMD_NONE = 0, ///< None
SIMD_SSE = 1 << 0, ///< SSE
SIMD_SSE2 = 1 << 1, ///< SSE 2
......@@ -49,22 +28,52 @@ private:
SIMD_AVX = 1 << 8, ///< AVX
SIMD_AVX2 = 1 << 9, ///< AVX 2
SIMD_AVX512 = 1 << 10, ///< AVX 512
};
};
/// simd flags
class SIMDFlags final {
public:
DISABLE_COPY(SIMDFlags);
SIMDFlags();
static SIMDFlags const* instance();
bool check(int flags) const;
private:
int simd_flags_ = SIMD_NONE;
};
#define HAS_SSE SIMDFlags::instance()->isSSE()
#define HAS_SSE2 SIMDFlags::instance()->isSSE2()
#define HAS_SSE3 SIMDFlags::instance()->isSSE3()
#define HAS_SSSE3 SIMDFlags::instance()->isSSSE3()
#define HAS_SSE41 SIMDFlags::instance()->isSSE41()
#define HAS_SSE42 SIMDFlags::instance()->isSSE42()
#define HAS_FMA3 SIMDFlags::instance()->isFMA3()
#define HAS_FMA4 SIMDFlags::instance()->isFMA4()
#define HAS_AVX SIMDFlags::instance()->isAVX()
#define HAS_AVX2 SIMDFlags::instance()->isAVX2()
#define HAS_AVX512 SIMDFlags::instance()->isAVX512()
/**
* @brief Check SIMD flags at runtime.
*
* For example.
* @code{.cpp}
*
* if (HAS_SIMD(SIMD_AVX2 | SIMD_FMA4)) {
* avx2_fm4_stub();
* } else if (HAS_SIMD(SIMD_AVX)) {
* avx_stub();
* }
*
* @endcode
*/
#define HAS_SIMD(__flags) SIMDFlags::instance()->check(__flags)
/**
* @brief Check SIMD flags at runtime.
*
* 1. Check all SIMD flags at runtime: HAS_SSE && HAS_SSE2 && HAS_SSE3
* 2. Check one SIMD flags at runtime: HAS_SSE || HAS_SSE2 || HAS_SSE3
*/
#define HAS_SSE HAS_SIMD(SIMD_SSE)
#define HAS_SSE2 HAS_SIMD(SIMD_SSE2)
#define HAS_SSE3 HAS_SIMD(SIMD_SSE3)
#define HAS_SSSE3 HAS_SIMD(SIMD_SSSE3)
#define HAS_SSE41 HAS_SIMD(SIMD_SSE41)
#define HAS_SSE42 HAS_SIMD(SIMD_SSE42)
#define HAS_FMA3 HAS_SIMD(SIMD_FMA3)
#define HAS_FMA4 HAS_SIMD(SIMD_FMA4)
#define HAS_AVX HAS_SIMD(SIMD_AVX)
#define HAS_AVX2 HAS_SIMD(SIMD_AVX2)
#define HAS_AVX512 HAS_SIMD(SIMD_AVX512)
} // namespace paddle
......@@ -32,17 +32,16 @@ TEST(SIMDFlags, gccTest) {
}
TEST(SIMDFlags, normalPrint) {
auto simd = SIMDFlags::instance();
LOG(INFO) << "Has SSE2: " << std::boolalpha << simd->isSSE2();
LOG(INFO) << "Has SSE3: " << std::boolalpha << simd->isSSE3();
LOG(INFO) << "Has SSSE3: " << std::boolalpha << simd->isSSSE3();
LOG(INFO) << "Has SSE4.1: " << std::boolalpha << simd->isSSE41();
LOG(INFO) << "Has SSE4.2: " << std::boolalpha << simd->isSSE42();
LOG(INFO) << "Has FMA3: " << std::boolalpha << simd->isFMA3();
LOG(INFO) << "Has FMA4: " << std::boolalpha << simd->isFMA4();
LOG(INFO) << "Has AVX: " << std::boolalpha << simd->isAVX();
LOG(INFO) << "Has AVX2: " << std::boolalpha << simd->isAVX2();
LOG(INFO) << "Has AVX512: " << std::boolalpha << simd->isAVX512();
LOG(INFO) << "Has SSE: " << std::boolalpha << HAS_SSE;
LOG(INFO) << "Has SSE2: " << std::boolalpha << HAS_SSE2;
LOG(INFO) << "Has SSE3: " << std::boolalpha << HAS_SSE3;
LOG(INFO) << "Has SSSE3: " << std::boolalpha << HAS_SSSE3;
LOG(INFO) << "Has SSE4: " << std::boolalpha << HAS_SSE41 || HAS_SSE42;
LOG(INFO) << "Has FMA3: " << std::boolalpha << HAS_FMA3;
LOG(INFO) << "Has FMA4: " << std::boolalpha << HAS_FMA4;
LOG(INFO) << "Has AVX: " << std::boolalpha << HAS_AVX;
LOG(INFO) << "Has AVX2: " << std::boolalpha << HAS_AVX2;
LOG(INFO) << "Has AVX512: " << std::boolalpha << HAS_AVX512;
}
int main(int argc, char** argv) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册