Files
2026-07-13 12:47:42 +08:00

286 lines
13 KiB
C++

// Copyright 2025-present the zvec project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <ailego/internal/cpu_features.h>
#include <gtest/gtest.h>
using namespace zvec::ailego::internal;
TEST(CpuFeatures, General) {
std::cout << "* Intrinsics: " << CpuFeatures::Intrinsics() << std::endl;
std::cout << "* F16C: " << CpuFeatures::F16C() << std::endl;
std::cout << "* SSE: " << CpuFeatures::SSE() << std::endl;
std::cout << "* SSE2: " << CpuFeatures::SSE2() << std::endl;
std::cout << "* SSE3: " << CpuFeatures::SSE3() << std::endl;
std::cout << "* SSSE3: " << CpuFeatures::SSSE3() << std::endl;
std::cout << "* SSE4_1: " << CpuFeatures::SSE4_1() << std::endl;
std::cout << "* SSE4_2: " << CpuFeatures::SSE4_2() << std::endl;
std::cout << "* AVX: " << CpuFeatures::AVX() << std::endl;
std::cout << "* AVX2: " << CpuFeatures::AVX2() << std::endl;
std::cout << "* AVX512F: " << CpuFeatures::AVX512F() << std::endl;
std::cout << "* AVX512DQ: " << CpuFeatures::AVX512DQ() << std::endl;
std::cout << "* AVX512PF: " << CpuFeatures::AVX512PF() << std::endl;
std::cout << "* AVX512ER: " << CpuFeatures::AVX512ER() << std::endl;
std::cout << "* AVX512CD: " << CpuFeatures::AVX512CD() << std::endl;
std::cout << "* AVX512BW: " << CpuFeatures::AVX512BW() << std::endl;
std::cout << "* AVX512VL: " << CpuFeatures::AVX512VL() << std::endl;
std::cout << "* AVX512_IFMA: " << CpuFeatures::AVX512_IFMA()
<< std::endl;
std::cout << "* AVX512_VBMI: " << CpuFeatures::AVX512_VBMI()
<< std::endl;
std::cout << "* AVX512_VBMI2: " << CpuFeatures::AVX512_VBMI2()
<< std::endl;
std::cout << "* AVX512_VNNI: " << CpuFeatures::AVX512_VNNI()
<< std::endl;
std::cout << "* AVX512_BITALG: " << CpuFeatures::AVX512_BITALG()
<< std::endl;
std::cout << "* AVX512_VPOPCNTDQ: " << CpuFeatures::AVX512_VPOPCNTDQ()
<< std::endl;
std::cout << "* AVX512_4VNNIW: " << CpuFeatures::AVX512_4VNNIW()
<< std::endl;
std::cout << "* AVX512_4FMAPS: " << CpuFeatures::AVX512_4FMAPS()
<< std::endl;
std::cout << "* AVX512_FP16: " << CpuFeatures::AVX512_FP16()
<< std::endl;
std::cout << "* CX8: " << CpuFeatures::CX8() << std::endl;
std::cout << "* CX16: " << CpuFeatures::CX16() << std::endl;
std::cout << "* PCLMULQDQ: " << CpuFeatures::PCLMULQDQ() << std::endl;
std::cout << "* VPCLMULQDQ: " << CpuFeatures::VPCLMULQDQ() << std::endl;
std::cout << "* CMOV: " << CpuFeatures::CMOV() << std::endl;
std::cout << "* MOVBE: " << CpuFeatures::MOVBE() << std::endl;
std::cout << "* ERMS: " << CpuFeatures::ERMS() << std::endl;
std::cout << "* POPCNT: " << CpuFeatures::POPCNT() << std::endl;
std::cout << "* XSAVE: " << CpuFeatures::XSAVE() << std::endl;
std::cout << "* FMA: " << CpuFeatures::FMA() << std::endl;
std::cout << "* ADX: " << CpuFeatures::ADX() << std::endl;
std::cout << "* GFNI: " << CpuFeatures::GFNI() << std::endl;
std::cout << "* AES: " << CpuFeatures::AES() << std::endl;
std::cout << "* VAES: " << CpuFeatures::VAES() << std::endl;
std::cout << "* RDSEED: " << CpuFeatures::RDSEED() << std::endl;
std::cout << "* RDRAND: " << CpuFeatures::RDRAND() << std::endl;
std::cout << "* SHA: " << CpuFeatures::SHA() << std::endl;
std::cout << "* BMI1: " << CpuFeatures::BMI1() << std::endl;
std::cout << "* BMI2: " << CpuFeatures::BMI2() << std::endl;
std::cout << "* CLFLUSH: " << CpuFeatures::CLFLUSH() << std::endl;
std::cout << "* CLFLUSHOPT: " << CpuFeatures::CLFLUSHOPT() << std::endl;
std::cout << "* CLWB: " << CpuFeatures::CLWB() << std::endl;
std::cout << "* RDPID: " << CpuFeatures::RDPID() << std::endl;
std::cout << "* FPU: " << CpuFeatures::FPU() << std::endl;
std::cout << "* HT: " << CpuFeatures::HT() << std::endl;
std::cout << "* VMX: " << CpuFeatures::VMX() << std::endl;
std::cout << "* HYPERVISOR: " << CpuFeatures::HYPERVISOR() << std::endl;
// #if defined(__AVX512VBMI2__)
// EXPECT_TRUE(CpuFeatures::AVX512VBMI2());
// #endif
// #if defined(__AVX512VBMI__)
// EXPECT_TRUE(CpuFeatures::AVX512VBMI());
// #endif
// #if defined(__AVX512VL__)
// EXPECT_TRUE(CpuFeatures::AVX512VL());
// #endif
// #if defined(__AVX512BW__)
// EXPECT_TRUE(CpuFeatures::AVX512BW());
// #endif
// #if defined(__AVX512CD__)
// EXPECT_TRUE(CpuFeatures::AVX512CD());
// #endif
// #if defined(__AVX512ER__)
// EXPECT_TRUE(CpuFeatures::AVX512ER());
// #endif
// #if defined(__AVX512PF__)
// EXPECT_TRUE(CpuFeatures::AVX512PF());
// #endif
// #if defined(__AVX512IFMA__)
// EXPECT_TRUE(CpuFeatures::AVX512IFMA());
// #endif
// #if defined(__AVX512DQ__)
// EXPECT_TRUE(CpuFeatures::AVX512DQ());
// #endif
// #if defined(__AVX512F__)
// EXPECT_TRUE(CpuFeatures::AVX512F());
// #endif
#if defined(__AVX2__)
EXPECT_TRUE(CpuFeatures::AVX2());
EXPECT_TRUE(CpuFeatures::AVX());
EXPECT_TRUE(CpuFeatures::SSE4_2());
EXPECT_TRUE(CpuFeatures::SSE4_1());
EXPECT_TRUE(CpuFeatures::SSSE3());
EXPECT_TRUE(CpuFeatures::SSE3());
EXPECT_TRUE(CpuFeatures::SSE2());
EXPECT_TRUE(CpuFeatures::SSE());
EXPECT_TRUE(CpuFeatures::MMX());
#endif
#if defined(__AVX__)
EXPECT_TRUE(CpuFeatures::AVX());
EXPECT_TRUE(CpuFeatures::SSE4_2());
EXPECT_TRUE(CpuFeatures::SSE4_1());
EXPECT_TRUE(CpuFeatures::SSSE3());
EXPECT_TRUE(CpuFeatures::SSE3());
EXPECT_TRUE(CpuFeatures::SSE2());
EXPECT_TRUE(CpuFeatures::SSE());
EXPECT_TRUE(CpuFeatures::MMX());
#endif
#if defined(__SSE4_2__)
EXPECT_TRUE(CpuFeatures::SSE4_2());
EXPECT_TRUE(CpuFeatures::SSE4_1());
EXPECT_TRUE(CpuFeatures::SSSE3());
EXPECT_TRUE(CpuFeatures::SSE3());
EXPECT_TRUE(CpuFeatures::SSE2());
EXPECT_TRUE(CpuFeatures::SSE());
EXPECT_TRUE(CpuFeatures::MMX());
EXPECT_TRUE(CpuFeatures::POPCNT());
#endif
#if defined(__SSE4_1__)
EXPECT_TRUE(CpuFeatures::SSE4_1());
EXPECT_TRUE(CpuFeatures::SSSE3());
EXPECT_TRUE(CpuFeatures::SSE3());
EXPECT_TRUE(CpuFeatures::SSE2());
EXPECT_TRUE(CpuFeatures::SSE());
EXPECT_TRUE(CpuFeatures::MMX());
#endif
#if defined(__SSSE3__)
EXPECT_TRUE(CpuFeatures::SSSE3());
EXPECT_TRUE(CpuFeatures::SSE3());
EXPECT_TRUE(CpuFeatures::SSE2());
EXPECT_TRUE(CpuFeatures::SSE());
EXPECT_TRUE(CpuFeatures::MMX());
#endif
#if defined(__SSE3__)
EXPECT_TRUE(CpuFeatures::SSE3());
EXPECT_TRUE(CpuFeatures::SSE2());
EXPECT_TRUE(CpuFeatures::SSE());
EXPECT_TRUE(CpuFeatures::MMX());
#endif
#if defined(__SSE2__)
EXPECT_TRUE(CpuFeatures::SSE2());
EXPECT_TRUE(CpuFeatures::SSE());
EXPECT_TRUE(CpuFeatures::MMX());
#endif
#if defined(__SSE__)
EXPECT_TRUE(CpuFeatures::SSE());
EXPECT_TRUE(CpuFeatures::MMX());
#endif
#if defined(__MMX__)
EXPECT_TRUE(CpuFeatures::MMX());
#endif
}
TEST(CpuFeatures, Static) {
std::cout << "* F16C: " << CpuFeatures::static_flags_.F16C
<< std::endl;
std::cout << "* SSE: " << CpuFeatures::static_flags_.SSE
<< std::endl;
std::cout << "* SSE2: " << CpuFeatures::static_flags_.SSE2
<< std::endl;
std::cout << "* SSE3: " << CpuFeatures::static_flags_.SSE3
<< std::endl;
std::cout << "* SSSE3: " << CpuFeatures::static_flags_.SSSE3
<< std::endl;
std::cout << "* SSE4_1: " << CpuFeatures::static_flags_.SSE4_1
<< std::endl;
std::cout << "* SSE4_2: " << CpuFeatures::static_flags_.SSE4_2
<< std::endl;
std::cout << "* AVX: " << CpuFeatures::static_flags_.AVX
<< std::endl;
std::cout << "* AVX2: " << CpuFeatures::static_flags_.AVX2
<< std::endl;
std::cout << "* AVX512F: " << CpuFeatures::static_flags_.AVX512F
<< std::endl;
std::cout << "* AVX512DQ: " << CpuFeatures::static_flags_.AVX512DQ
<< std::endl;
std::cout << "* AVX512PF: " << CpuFeatures::static_flags_.AVX512PF
<< std::endl;
std::cout << "* AVX512ER: " << CpuFeatures::static_flags_.AVX512ER
<< std::endl;
std::cout << "* AVX512CD: " << CpuFeatures::static_flags_.AVX512CD
<< std::endl;
std::cout << "* AVX512BW: " << CpuFeatures::static_flags_.AVX512BW
<< std::endl;
std::cout << "* AVX512VL: " << CpuFeatures::static_flags_.AVX512VL
<< std::endl;
std::cout << "* AVX512_IFMA: " << CpuFeatures::static_flags_.AVX512_IFMA
<< std::endl;
std::cout << "* AVX512_VBMI: " << CpuFeatures::static_flags_.AVX512_VBMI
<< std::endl;
std::cout << "* AVX512_VBMI2: " << CpuFeatures::static_flags_.AVX512_VBMI2
<< std::endl;
std::cout << "* AVX512_VNNI: " << CpuFeatures::static_flags_.AVX512_VNNI
<< std::endl;
std::cout << "* AVX512_BITALG: "
<< CpuFeatures::static_flags_.AVX512_BITALG << std::endl;
std::cout << "* AVX512_VPOPCNTDQ: "
<< CpuFeatures::static_flags_.AVX512_VPOPCNTDQ << std::endl;
std::cout << "* AVX512_4VNNIW: "
<< CpuFeatures::static_flags_.AVX512_4VNNIW << std::endl;
std::cout << "* AVX512_4FMAPS: "
<< CpuFeatures::static_flags_.AVX512_4FMAPS << std::endl;
std::cout << "* AVX512_FP16: " << CpuFeatures::static_flags_.AVX512_FP16
<< std::endl;
std::cout << "* CX8: " << CpuFeatures::static_flags_.CX8
<< std::endl;
std::cout << "* CX16: " << CpuFeatures::static_flags_.CX16
<< std::endl;
std::cout << "* PCLMULQDQ: " << CpuFeatures::static_flags_.PCLMULQDQ
<< std::endl;
std::cout << "* VPCLMULQDQ: " << CpuFeatures::static_flags_.VPCLMULQDQ
<< std::endl;
std::cout << "* CMOV: " << CpuFeatures::static_flags_.CMOV
<< std::endl;
std::cout << "* MOVBE: " << CpuFeatures::static_flags_.MOVBE
<< std::endl;
std::cout << "* ERMS: " << CpuFeatures::static_flags_.ERMS
<< std::endl;
std::cout << "* POPCNT: " << CpuFeatures::static_flags_.POPCNT
<< std::endl;
std::cout << "* XSAVE: " << CpuFeatures::static_flags_.XSAVE
<< std::endl;
std::cout << "* FMA: " << CpuFeatures::static_flags_.FMA
<< std::endl;
std::cout << "* ADX: " << CpuFeatures::static_flags_.ADX
<< std::endl;
std::cout << "* GFNI: " << CpuFeatures::static_flags_.GFNI
<< std::endl;
std::cout << "* AES: " << CpuFeatures::static_flags_.AES
<< std::endl;
std::cout << "* VAES: " << CpuFeatures::static_flags_.VAES
<< std::endl;
std::cout << "* RDSEED: " << CpuFeatures::static_flags_.RDSEED
<< std::endl;
std::cout << "* RDRAND: " << CpuFeatures::static_flags_.RDRAND
<< std::endl;
std::cout << "* SHA: " << CpuFeatures::static_flags_.SHA
<< std::endl;
std::cout << "* BMI1: " << CpuFeatures::static_flags_.BMI1
<< std::endl;
std::cout << "* BMI2: " << CpuFeatures::static_flags_.BMI2
<< std::endl;
std::cout << "* CLFLUSH: " << CpuFeatures::static_flags_.CLFLUSH
<< std::endl;
std::cout << "* CLFLUSHOPT: " << CpuFeatures::static_flags_.CLFLUSHOPT
<< std::endl;
std::cout << "* CLWB: " << CpuFeatures::static_flags_.CLWB
<< std::endl;
std::cout << "* RDPID: " << CpuFeatures::static_flags_.RDPID
<< std::endl;
std::cout << "* FPU: " << CpuFeatures::static_flags_.FPU
<< std::endl;
std::cout << "* HT: " << CpuFeatures::static_flags_.HT
<< std::endl;
std::cout << "* VMX: " << CpuFeatures::static_flags_.VMX
<< std::endl;
std::cout << "* HYPERVISOR: " << CpuFeatures::static_flags_.HYPERVISOR
<< std::endl;
}