C++ SSE/AVX/SHA/AES指令集检查,用于程序定向优化。

结构定义:

cpp 复制代码
    class CPU final
    {
    public:
        static bool             has_sse2;
        static bool             has_sse3;
        static bool             has_ssse3;
        static bool             has_sse4_1;
        static bool             has_sse4_2;
        static bool             has_avx;
        static bool             has_avx2;
        static bool             has_avx512f;
        static bool             has_sse;
        static bool             has_aes;
        static bool             has_sha;

    public:
        static void             cpuid(unsigned int func, unsigned int& eax, unsigned int& ebx, unsigned int& ecx, unsigned int& edx) noexcept;
    };

检测实现:

cpp 复制代码
    bool CPU::has_sse       = false;
    bool CPU::has_sse2      = false;
    bool CPU::has_sse3      = false;
    bool CPU::has_ssse3     = false;
    bool CPU::has_sse4_1    = false;
    bool CPU::has_sse4_2    = false;
    bool CPU::has_avx       = false;
    bool CPU::has_avx2      = false;
    bool CPU::has_avx512f   = false;
    bool CPU::has_aes       = false;
    bool CPU::has_sha       = false;

    void CPU_detect() noexcept
    {
        unsigned int eax, ebx, ecx, edx;
        
        // 获取基本最大level
        CPU::cpuid(0, eax, ebx, ecx, edx);
        unsigned int max_base = eax;
        
        // 检测基本功能1
        if (max_base >= 1) {
            CPU::cpuid(1, eax, ebx, ecx, edx);

            // 根据映射表设置特性标志
            CPU::has_sse = (edx & (1 << 25)) != 0;    // SSE - EDX[25]
            CPU::has_sse2 = (edx & (1 << 26)) != 0;  // SSE2 - EDX[26]
            CPU::has_sse3 = (ecx & (1 << 0)) != 0;   // SSE3 - ECX[0]
            CPU::has_aes = (ecx & (1 << 25)) != 0;   // AES - ECX[25]
            CPU::has_avx = (ecx & (1 << 28)) != 0;   // AVX - ECX[28]
        }

        // 检测扩展功能7
        CPU::cpuid(0, eax, ebx, ecx, edx); // 重新获取最大level
        if (eax >= 7) { 
            // EAX=7, ECX=0 for extended features
            int cpus[4];
            __cpuidex(cpus, 7, 0);
            ebx = cpus[1];

            // Check bit 5 of EBX for AVX2 support
            // GCC -> __builtin_cpu_supports("avx2")
            CPU::has_avx2 = (ebx & (1 << 5)) != 0;      // AVX2 - EBX[5]
            CPU::has_avx512f = (ebx & (1 << 16)) != 0;  // AVX512F - EBX[16]
            CPU::has_sha = (ebx & (1 << 29)) != 0;      // SHA - EBX[29]
        }

        // 补充检测SSSE3, SSE4.1, SSE4.2(在基本功能1中)
        if (max_base >= 1) {
            CPU::cpuid(1, eax, ebx, ecx, edx);
            CPU::has_ssse3 = (ecx & (1 << 9)) != 0;   // SSSE3 - ECX[9]
            CPU::has_sse4_1 = (ecx & (1 << 19)) != 0; // SSE4.1 - ECX[19]
            CPU::has_sse4_2 = (ecx & (1 << 20)) != 0; // SSE4.2 - ECX[20]
        }
    }
相关推荐
CSDN_Colinw19 小时前
C++中的工厂方法模式
开发语言·c++·算法
liulilittle19 小时前
范围随机算法实现
开发语言·c++·算法·lua·c·js
乌索普-19 小时前
基于vue2的简易购物车
开发语言·前端·javascript
走粥19 小时前
使用indexOf查找对象结合Pinia持久化引发的问题
开发语言·前端·javascript
csbysj202019 小时前
Python break 语句详解
开发语言
轩情吖19 小时前
MySQL之用户管理
数据库·c++·后端·mysql·权限管理·用户管理
2401_8579182919 小时前
C++中的访问者模式实战
开发语言·c++·算法
格林威19 小时前
工业相机图像高速存储(C++版):RAID 0 NVMe SSD 阵列暴力提速,附海康实战代码!
开发语言·c++·人工智能·数码相机·计算机视觉·工业相机·堡盟相机
elseif12320 小时前
CSP-S提高级大纲
开发语言·数据结构·c++·笔记·算法·大纲·考纲
波特率11520020 小时前
C++中类的const与static关键字修饰函数与变量辨析
开发语言·c++·