[C++]c++判断CPU的类型及支持的指令集

1、利用cpui判断cpu的类型及支持的指令集,可以进行条件编程:(InstructionSet.h)

#pragma once// InstructionSet.cpp
// Compile by using: cl /EHsc /W4 InstructionSet.cpp
// processor: x86, x64
// Uses the __cpuid intrinsic to get information about
// CPU extended instruction set support.#include <opencv2/opencv.hpp>
#include <bitset>
#include <array>
#include <string>
#include <intrin.h>class InstructionSet
{// forward declarationsclass InstructionSet_Internal;public:// gettersstatic std::string Vendor(void) { return CPU_Rep.vendor_; }static std::string Brand(void) { return CPU_Rep.brand_; }static bool SSE3(void) { return CPU_Rep.f_1_ECX_[0]; }static bool PCLMULQDQ(void) { return CPU_Rep.f_1_ECX_[1]; }static bool MONITOR(void) { return CPU_Rep.f_1_ECX_[3]; }static bool SSSE3(void) { return CPU_Rep.f_1_ECX_[9]; }static bool FMA(void) { return CPU_Rep.f_1_ECX_[12]; }static bool CMPXCHG16B(void) { return CPU_Rep.f_1_ECX_[13]; }static bool SSE41(void) { return CPU_Rep.f_1_ECX_[19]; }static bool SSE42(void) { return CPU_Rep.f_1_ECX_[20]; }static bool MOVBE(void) { return CPU_Rep.f_1_ECX_[22]; }static bool POPCNT(void) { return CPU_Rep.f_1_ECX_[23]; }static bool AES(void) { return CPU_Rep.f_1_ECX_[25]; }static bool XSAVE(void) { return CPU_Rep.f_1_ECX_[26]; }static bool OSXSAVE(void) { return CPU_Rep.f_1_ECX_[27]; }static bool AVX(void) { return CPU_Rep.f_1_ECX_[28]; }static bool F16C(void) { return CPU_Rep.f_1_ECX_[29]; }static bool RDRAND(void) { return CPU_Rep.f_1_ECX_[30]; }static bool MSR(void) { return CPU_Rep.f_1_EDX_[5]; }static bool CX8(void) { return CPU_Rep.f_1_EDX_[8]; }static bool SEP(void) { return CPU_Rep.f_1_EDX_[11]; }static bool CMOV(void) { return CPU_Rep.f_1_EDX_[15]; }static bool CLFSH(void) { return CPU_Rep.f_1_EDX_[19]; }static bool MMX(void) { return CPU_Rep.f_1_EDX_[23]; }static bool FXSR(void) { return CPU_Rep.f_1_EDX_[24]; }static bool SSE(void) { return CPU_Rep.f_1_EDX_[25]; }static bool SSE2(void) { return CPU_Rep.f_1_EDX_[26]; }static bool FSGSBASE(void) { return CPU_Rep.f_7_EBX_[0]; }static bool BMI1(void) { return CPU_Rep.f_7_EBX_[3]; }static bool HLE(void) { return CPU_Rep.isIntel_ && CPU_Rep.f_7_EBX_[4]; }static bool AVX2(void) { return CPU_Rep.f_7_EBX_[5]; }static bool BMI2(void) { return CPU_Rep.f_7_EBX_[8]; }static bool ERMS(void) { return CPU_Rep.f_7_EBX_[9]; }static bool INVPCID(void) { return CPU_Rep.f_7_EBX_[10]; }static bool RTM(void) { return CPU_Rep.isIntel_ && CPU_Rep.f_7_EBX_[11]; }static bool AVX512F(void) { return CPU_Rep.f_7_EBX_[16]; }static bool RDSEED(void) { return CPU_Rep.f_7_EBX_[18]; }static bool ADX(void) { return CPU_Rep.f_7_EBX_[19]; }static bool AVX512PF(void) { return CPU_Rep.f_7_EBX_[26]; }static bool AVX512ER(void) { return CPU_Rep.f_7_EBX_[27]; }static bool AVX512CD(void) { return CPU_Rep.f_7_EBX_[28]; }static bool SHA(void) { return CPU_Rep.f_7_EBX_[29]; }static bool PREFETCHWT1(void) { return CPU_Rep.f_7_ECX_[0]; }static bool LAHF(void) { return CPU_Rep.f_81_ECX_[0]; }static bool LZCNT(void) { return CPU_Rep.isIntel_ && CPU_Rep.f_81_ECX_[5]; }static bool ABM(void) { return CPU_Rep.isAMD_ && CPU_Rep.f_81_ECX_[5]; }static bool SSE4a(void) { return CPU_Rep.isAMD_ && CPU_Rep.f_81_ECX_[6]; }static bool XOP(void) { return CPU_Rep.isAMD_ && CPU_Rep.f_81_ECX_[11]; }static bool TBM(void) { return CPU_Rep.isAMD_ && CPU_Rep.f_81_ECX_[21]; }static bool SYSCALL(void) { return CPU_Rep.isIntel_ && CPU_Rep.f_81_EDX_[11]; }static bool MMXEXT(void) { return CPU_Rep.isAMD_ && CPU_Rep.f_81_EDX_[22]; }static bool RDTSCP(void) { return CPU_Rep.isIntel_ && CPU_Rep.f_81_EDX_[27]; }static bool _3DNOWEXT(void) { return CPU_Rep.isAMD_ && CPU_Rep.f_81_EDX_[30]; }static bool _3DNOW(void) { return CPU_Rep.isAMD_ && CPU_Rep.f_81_EDX_[31]; }//private:static const InstructionSet_Internal CPU_Rep;class InstructionSet_Internal{public:InstructionSet_Internal(): nIds_{ 0 },nExIds_{ 0 },isIntel_{ false },isAMD_{ false },f_1_ECX_{ 0 },f_1_EDX_{ 0 },f_7_EBX_{ 0 },f_7_ECX_{ 0 },f_81_ECX_{ 0 },f_81_EDX_{ 0 },data_{},extdata_{}{//int cpuInfo[4] = {-1};std::array<int, 4> cpui;// Calling __cpuid with 0x0 as the function_id argument// gets the number of the highest valid function ID.__cpuid(cpui.data(), 0);nIds_ = cpui[0];for (int i = 0; i <= nIds_; ++i){__cpuidex(cpui.data(), i, 0);data_.push_back(cpui);}// Capture vendor stringchar vendor[0x20];memset(vendor, 0, sizeof(vendor));*reinterpret_cast<int*>(vendor) = data_[0][1];*reinterpret_cast<int*>(vendor + 4) = data_[0][3];*reinterpret_cast<int*>(vendor + 8) = data_[0][2];vendor_ = vendor;if (vendor_ == "GenuineIntel"){isIntel_ = true;}else if (vendor_ == "AuthenticAMD"){isAMD_ = true;}// load bitset with flags for function 0x00000001if (nIds_ >= 1){f_1_ECX_ = data_[1][2];f_1_EDX_ = data_[1][3];}// load bitset with flags for function 0x00000007if (nIds_ >= 7){f_7_EBX_ = data_[7][1];f_7_ECX_ = data_[7][2];}// Calling __cpuid with 0x80000000 as the function_id argument// gets the number of the highest valid extended ID.__cpuid(cpui.data(), 0x80000000);nExIds_ = cpui[0];char brand[0x40];memset(brand, 0, sizeof(brand));for (int i = 0x80000000; i <= nExIds_; ++i){__cpuidex(cpui.data(), i, 0);extdata_.push_back(cpui);}// load bitset with flags for function 0x80000001if (nExIds_ >= 0x80000001){f_81_ECX_ = extdata_[1][2];f_81_EDX_ = extdata_[1][3];}// Interpret CPU brand string if reportedif (nExIds_ >= 0x80000004){memcpy(brand, extdata_[2].data(), sizeof(cpui));memcpy(brand + 16, extdata_[3].data(), sizeof(cpui));memcpy(brand + 32, extdata_[4].data(), sizeof(cpui));brand_ = brand;}};int nIds_;int nExIds_;std::string vendor_;std::string brand_;bool isIntel_;bool isAMD_;std::bitset<32> f_1_ECX_;std::bitset<32> f_1_EDX_;std::bitset<32> f_7_EBX_;std::bitset<32> f_7_ECX_;std::bitset<32> f_81_ECX_;std::bitset<32> f_81_EDX_;std::vector<std::array<int, 4>> data_;std::vector<std::array<int, 4>> extdata_;};
};// Initialize static member data
const InstructionSet::InstructionSet_Internal InstructionSet::CPU_Rep;// Print out supported instruction set extensions
//int main()
//{
//    auto& outstream = std::cout;
//
//    auto support_message = [&outstream](std::string isa_feature, bool is_supported) {
//        outstream << isa_feature << (is_supported ? " supported" : " not supported") << std::endl;
//    };
//
//    std::cout << InstructionSet::Vendor() << std::endl;
//    std::cout << InstructionSet::Brand() << std::endl;
//
//    support_message("3DNOW", InstructionSet::_3DNOW());
//    support_message("3DNOWEXT", InstructionSet::_3DNOWEXT());
//    support_message("ABM", InstructionSet::ABM());
//    support_message("ADX", InstructionSet::ADX());
//    support_message("AES", InstructionSet::AES());
//    support_message("AVX", InstructionSet::AVX());
//    support_message("AVX2", InstructionSet::AVX2());
//    support_message("AVX512CD", InstructionSet::AVX512CD());
//    support_message("AVX512ER", InstructionSet::AVX512ER());
//    support_message("AVX512F", InstructionSet::AVX512F());
//    support_message("AVX512PF", InstructionSet::AVX512PF());
//    support_message("BMI1", InstructionSet::BMI1());
//    support_message("BMI2", InstructionSet::BMI2());
//    support_message("CLFSH", InstructionSet::CLFSH());
//    support_message("CMPXCHG16B", InstructionSet::CMPXCHG16B());
//    support_message("CX8", InstructionSet::CX8());
//    support_message("ERMS", InstructionSet::ERMS());
//    support_message("F16C", InstructionSet::F16C());
//    support_message("FMA", InstructionSet::FMA());
//    support_message("FSGSBASE", InstructionSet::FSGSBASE());
//    support_message("FXSR", InstructionSet::FXSR());
//    support_message("HLE", InstructionSet::HLE());
//    support_message("INVPCID", InstructionSet::INVPCID());
//    support_message("LAHF", InstructionSet::LAHF());
//    support_message("LZCNT", InstructionSet::LZCNT());
//    support_message("MMX", InstructionSet::MMX());
//    support_message("MMXEXT", InstructionSet::MMXEXT());
//    support_message("MONITOR", InstructionSet::MONITOR());
//    support_message("MOVBE", InstructionSet::MOVBE());
//    support_message("MSR", InstructionSet::MSR());
//    support_message("OSXSAVE", InstructionSet::OSXSAVE());
//    support_message("PCLMULQDQ", InstructionSet::PCLMULQDQ());
//    support_message("POPCNT", InstructionSet::POPCNT());
//    support_message("PREFETCHWT1", InstructionSet::PREFETCHWT1());
//    support_message("RDRAND", InstructionSet::RDRAND());
//    support_message("RDSEED", InstructionSet::RDSEED());
//    support_message("RDTSCP", InstructionSet::RDTSCP());
//    support_message("RTM", InstructionSet::RTM());
//    support_message("SEP", InstructionSet::SEP());
//    support_message("SHA", InstructionSet::SHA());
//    support_message("SSE", InstructionSet::SSE());
//    support_message("SSE2", InstructionSet::SSE2());
//    support_message("SSE3", InstructionSet::SSE3());
//    support_message("SSE4.1", InstructionSet::SSE41());
//    support_message("SSE4.2", InstructionSet::SSE42());
//    support_message("SSE4a", InstructionSet::SSE4a());
//    support_message("SSSE3", InstructionSet::SSSE3());
//    support_message("SYSCALL", InstructionSet::SYSCALL());
//    support_message("TBM", InstructionSet::TBM());
//    support_message("XOP", InstructionSet::XOP());
//    support_message("XSAVE", InstructionSet::XSAVE());
//}

2、例子:

我使用的电脑cpu为Intel的,并且支持大部分指令集

#include"InstructionSet.h"
#include <iostream>using namespace std;int main()
{//构造InstructionSet类InstructionSet test;cout << "是否支持SSE2指令集:  " << (bool)test.SSE2 << endl;cout << "是否支持AVX2指令集:  " << (bool)test.AVX2 << endl;cout << "是否为Intel平台 :  " << (bool)test.CPU_Rep.isIntel_ << endl;cout << "是否为AMD平台 :  " << (bool)test.CPU_Rep.isAMD_ << endl;return 0;
}

【参考文献】

[1] https://learn.microsoft.com/zh-cn/cpp/intrinsics/cpuid-cpuidex?view=msvc-170

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/247596.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DolphinScheduler + Amazon EMR Serverless 的集成实践

01 背景 Apache DolphinScheduler 是一个分布式的可视化 DAG 工作流任务调度开源系统&#xff0c;具有简单易用、高可靠、高扩展性、⽀持丰富的使用场景、提供多租户模式等特性。适用于企业级场景&#xff0c;提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方…

uniapp上传音频文件到服务器

视频教程地址&#xff1a; 【uniapp录音上传组件&#xff0c;将录音上传到django服务器】 https://www.bilibili.com/video/BV1wi4y1p7FL/?share_sourcecopy_web&vd_sourcee66c0e33402a09ca7ae1f0ed3d5ecf7c uniapp 录制音频文件上传到django服务器保存到服务器 &#xf…

群辉开启WebDav服务+cpolar内网穿透实现移动端ES文件浏览器远程访问本地NAS文件

文章目录 1. 安装启用WebDAV2. 安装cpolar3. 配置公网访问地址4. 公网测试连接5. 固定连接公网地址6. 使用固定地址测试连接 本文主要介绍如何在群辉中开启WebDav服务&#xff0c;并结合cpolar内网穿透工具生成的公网地址&#xff0c;通过移动客户端ES文件浏览器即可实现移动设…

msfconsole实战使用(结合靶场演示)

msfconsole实战使用 前言 MSFconsole&#xff08;Metasploit Framework Console&#xff09;是Metasploit框架的一部分&#xff0c;是一个功能强大的渗透测试工具。Metasploit框架是一个开源的安全工具&#xff0c;旨在开发、测试和执行针对计算机系统的攻击。MSFconsole是Me…

数据湖技术之发展现状篇

一. 大数据处理架构&#xff1a; 大数据处理架构的发展过程具体可以分为三个主要阶段&#xff1a;批处理架构、混合处理架构&#xff08;Lambda、Kappa架构&#xff09;、湖仓一体。首先是随着Hadoop生态相关技术的大量应用&#xff0c;批处理架构应运而生&#xff0c;借助离线…

ThinkPhp3.2(qidian)部署文档

宝塔环境部署 申请域名以及域名解析 具体配置&#xff0c;可百度之 在宝塔面板中创建网站 上传代码导入数据配置运行目录 注意&#xff1a;&#xff08;如果版本&#xff1a;thinkphp3.2 &#xff09;配置 运行目录要特别注意&#xff1a;运行目录要选择根目录“/”&#xff…

C# 实现 gRPC 服务和调用

写在前面 gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。 主要优点如下&#xff1a; 1.高性能轻量化。 2.协议优先的 API 定义模式&#xff0c;默认使用协议缓冲区&#xff0c;允许与语言无关的实现。 3.可用于多种语言的工具&#xff0c;以生成强类型服务器和客户…

计算方法实验2:利用二分法及不动点迭代求解非线性方程

一、问题描述 利用二分法及不动点迭代求解非线性方程。 二、实验目的 掌握二分法及不动点迭代的算法原理&#xff1b;能分析两种方法的收敛性&#xff1b;能熟练编写代码实现利用二分法及不动点迭代来求解非线性方程。 三、实验内容及要求 二分法 (1) 编写代码计算下列数字…

w24文件上传之PHP伪协议

PHP支持的伪协议 file:// - 访问本地文件系统 http:// - 访问网址 ftp:// - 访问文件 php:// -访问各个输入/输出流 zlib:// -压缩流 data:// - 数据 glob:// -查找匹配的文件路径模式 phar:// - php归档 ssh2:// - Secure shell 2 rar:// - RAR ogg:// - 音频流 expect:// - …

时序预测 | Python基于Multihead-Attention-TCN-LSTM的时间序列预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 时序预测 | Python基于Multihead-Attention-TCN-LSTM的时间序列预测 Multihead-Attention-TCN-LSTM&#xff08;多头注意力-TCN-LSTM&#xff09;是一种结合了多个注意力机制、时序卷积网络&#xff08;TCN&#xff0…

elasticsearch8.x版本docker部署说明

前提&#xff0c;当前部署没有涉及证书和https访问 1、环境说明,我采用三个节点&#xff0c;每个节点启动两个es&#xff0c;用端口区分 主机角色ip和端口服务器Amaster192.168.2.223:9200服务器Adata192.168.2.223:9201服务器Bdata,master192.168.2.224:9200服务器Bdata192.1…

shopee,lazada卖家自养号测评补单的方法和技巧

现在很多卖家都是自己管理几百个账号&#xff0c;交给服务商不是特别靠谱 一&#xff1a;送测不及时&#xff0c;产品时常送不出去 二&#xff1a;账号质量不稳定&#xff0c;账号一天下了多少你也不清楚&#xff0c;如果下了很多单万一封号被关联了怎么办 三&#xff1a;as…

vue3前端开发,如何引入element-plus前端框架及配置参数

vue3前端开发,如何引入element-plus前端框架及配置参数&#xff01;这是一个简单的教程&#xff0c;帮助大家快速在自己的项目中引入element-plus框架。 主要是介绍的引入流程和参数的配置情况。 如图&#xff0c;这个就是elment-plus前端框架里面的一个主按钮展示。表示我们配…

C++STL之map、set的使用和模拟实现

绪论​&#xff1a; “我这个人走得很慢&#xff0c;但是我从不后退。——亚伯拉罕林肯”&#xff0c;本章是接上一章搜索二叉树中红黑树的后续文章&#xff0c;若没有看过强烈建议观看&#xff0c;否则后面模拟实现部分很看懂其代码原理。本章主要讲了map、set是如何使用的&am…

Spring - 基本用法参考

Spring 官方文档 Spring容器启动流程&#xff08;源码解读&#xff09; BeanFactoryPostProcessor vs BeanPostProcessor vs BeanDefinitionRegistryPostProcessor&#xff1a; From java doc&#xff1a; BeanFactoryPostProcessor may interact with and modify bean defin…

(九)springboot实战——springboot3下的webflux项目参数验证及其全局参数验证异常处理

前言 在上一节内容中&#xff0c;我们介绍了如何在webflux项目中自定义实现一个全局的异常处理器ErrorWebExceptionHandler&#xff0c;正常情况下其可以处理我们系统的运行时异常&#xff0c;但是无法处理参数验证的异常WebExchangeBindException&#xff0c;所以这里提供另外…

Nodejs前端学习Day3_准备工作

妈的&#xff0c;这几天真tm冷&#xff0c;前天上午还下了一整天的雪&#xff0c;大雪 文章目录 前言一、Node.js简介1.1何为1.2有什么 二、Node.js可以做什么三、学习路线四、下载nodejs4.1小坑记录4.2LTS和Current版本的不同 五、什么是终端六、在nodejs中执行js代码七、powe…

Linux使用匿名管道实现进程池得以高效通信

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;Nonsense—Sabrina Carpenter 0:50━━━━━━️&#x1f49f;──────── 2:43 &#x1f504; ◀️ ⏸ ▶️ …

ubuntu 22.04 安装mysql-8.0.34

ubuntu 22.04 安装mysql-8.0.34 1、基础安装配置 更新软件包&#xff1a; sudo apt update查看可用软件包&#xff1a; sudo apt search mysql-server安装最新版本&#xff1a; sudo apt install -y mysql-server或者&#xff0c;安装指定版本&#xff1a; sudo apt inst…

如何实现无公网ip远程SSH连接家中本地的树莓派

文章目录 如何通过 SSH 连接到树莓派步骤1. 在 Raspberry Pi 上启用 SSH步骤2. 查找树莓派的 IP 地址步骤3. SSH 到你的树莓派步骤 4. 在任何地点访问家中的树莓派4.1 安装 Cpolar4.2 cpolar进行token认证4.3 配置cpolar服务开机自启动4.4 查看映射到公网的隧道地址4.5 ssh公网…