​c++ cpu_features 调研使用​

news2024/9/8 23:58:33

一、背景

很多时候我们都会去关注内核,但是忽略了硬件本身的能力;尤其是可观测领域,大家一直在追求 trace、log的采样,metric也一直围绕集中在机器使用情况进行采集。

最近我一直在思考,如何能发觉机器的硬件能力?经过一段时间调研,我发现了谷歌的一个非常好用的cpu能力探测的工具,他的名字叫cpu_features,我们能不能发现机器硬件的cpu feature 然后上报成指标呢?

二、项目地址

https://github.com/google/cpu_features

三、编译

build_target_with_cmake() {

    local BUILD_ROOT=$1

    local LIB=$2

    # check if already installed

    if [ -f $INSTALL_PREFIX/lib/${LIB_FILES[$LIB]} ]; then

        format_print "$LIB" "$INSTALL_PREFIX/lib/${LIB_FILES[$LIB]}"

        return

    fi

    echo "Building $LIB..."

    local BUILD_OPTIONS=$UNIVERSAL_OPTIONS

    # check if there are additional options

    if [[ -v LIB_OPTIONS[$LIB] ]]; then

        BUILD_OPTIONS="${BUILD_OPTIONS} ${LIB_OPTIONS[$LIB]}"

    fi

    local LIB_SRC_DIR=$(pwd)/$LIB

    local LIB_BUILD_DIR=$BUILD_ROOT/$LIB-build

    mkdir -p $LIB_BUILD_DIR

    cmake -S $LIB_SRC_DIR -B $LIB_BUILD_DIR $BUILD_OPTIONS

    cmake --build $LIB_BUILD_DIR -j $(nproc)

    cmake --install $LIB_BUILD_DIR

}

四、轻松发现cpu feature

#include <opentelemetry/metrics/meter.h>

#include <cpu_features/cpu_features_macros.h>

#if defined(CPU_FEATURES_ARCH_X86)

#include <cpu_features/cpuinfo_x86.h>

#include <opentelemetry/metrics/provider.h>

#elif defined(CPU_FEATURES_ARCH_ARM)

#include <cpu_features/cpuinfo_arm.h>

#elif defined(CPU_FEATURES_ARCH_AARCH64)

#include <cpu_features/cpuinfo_aarch64.h>

#elif defined(CPU_FEATURES_ARCH_MIPS)

#include <cpu_features/cpuinfo_mips.h>

#elif defined(CPU_FEATURES_ARCH_PPC)

#include <cpu_features/cpuinfo_ppc.h>

#elif defined(CPU_FEATURES_ARCH_S390X)

#include <cpu_features/cpuinfo_s390x.h>

#elif defined(CPU_FEATURES_ARCH_RISCV)

#include <cpu_features/cpuinfo_riscv.h>

#elif defined(CPU_FEATURES_ARCH_LOONGARCH)

#include <cpu_features/cpuinfo_loongarch.h>

#endif

void Collector::run() {

#if defined(CPU_FEATURES_ARCH_X86)

    const ::cpu_features::X86Info info = ::cpu_features::GetX86Info();

    const ::cpu_features::CacheInfo cache_info = ::cpu_features::GetX86CacheInfo();

#elif defined(CPU_FEATURES_ARCH_ARM)

  const ArmInfo info = GetArmInfo();

  AddMapEntry(root, "arch", CreateString("ARM"));

  AddMapEntry(root, "implementer", CreateInt(info.implementer));

  AddMapEntry(root, "architecture", CreateInt(info.architecture));

  AddMapEntry(root, "variant", CreateInt(info.variant));

  AddMapEntry(root, "part", CreateInt(info.part));

  AddMapEntry(root, "revision", CreateInt(info.revision));

  AddFlags(root, &info.features);

#elif defined(CPU_FEATURES_ARCH_AARCH64)

  const Aarch64Info info = GetAarch64Info();

  AddMapEntry(root, "arch", CreateString("aarch64"));

  AddMapEntry(root, "implementer", CreateInt(info.implementer));

  AddMapEntry(root, "variant", CreateInt(info.variant));

  AddMapEntry(root, "part", CreateInt(info.part));

  AddMapEntry(root, "revision", CreateInt(info.revision));

  AddFlags(root, &info.features);

#elif defined(CPU_FEATURES_ARCH_MIPS)

  const MipsInfo info = GetMipsInfo();

  AddMapEntry(root, "arch", CreateString("mips"));

  AddFlags(root, &info.features);

#elif defined(CPU_FEATURES_ARCH_PPC)

  const PPCInfo info = GetPPCInfo();

  const PPCPlatformStrings strings = GetPPCPlatformStrings();

  AddMapEntry(root, "arch", CreateString("ppc"));

  AddMapEntry(root, "platform", CreateString(strings.platform));

  AddMapEntry(root, "model", CreateString(strings.model));

  AddMapEntry(root, "machine", CreateString(strings.machine));

  AddMapEntry(root, "cpu", CreateString(strings.cpu));

  AddMapEntry(root, "instruction", CreateString(strings.type.platform));

  AddMapEntry(root, "microarchitecture",

              CreateString(strings.type.base_platform));

  AddFlags(root, &info.features);

#elif defined(CPU_FEATURES_ARCH_S390X)

  const S390XInfo info = GetS390XInfo();

  const S390XPlatformStrings strings = GetS390XPlatformStrings();

  AddMapEntry(root, "arch", CreateString("s390x"));

  AddMapEntry(root, "platform", CreateString("zSeries"));

  AddMapEntry(root, "model", CreateString(strings.type.platform));

  AddMapEntry(root, "# processors", CreateInt(strings.num_processors));

  AddFlags(root, &info.features);

#elif defined(CPU_FEATURES_ARCH_RISCV)

  const RiscvInfo info = GetRiscvInfo();

  AddMapEntry(root, "arch", CreateString("risc-v"));

  AddMapEntry(root, "vendor", CreateString(info.vendor));

  AddMapEntry(root, "microarchitecture", CreateString(info.uarch));

  AddFlags(root, &info.features);

#elif defined(CPU_FEATURES_ARCH_LOONGARCH)

  const LoongArchInfo info = GetLoongArchInfo();

  AddMapEntry(root, "arch", CreateString("loongarch"));

  AddFlags(root, &info.features);

#endif

}

五、效果展示

{"arch":"x86","brand":"12th Gen Intel(R) Core(TM) i5-1240P","family":6,"model":154,"stepping":3,"uarch":"INTEL_ADL","flags":["adx","aes","avx","avx2","avx_vnni","bmi1","bmi2","clflushopt","clfsh","clwb","cx16","cx8","erms","f16c","fma3","fpu","fs_rep_mov","fs_rep_stosb","gfni","lzcnt","mmx","movbe","movdir64b","movdiri","pclmulqdq","popcnt","rdrnd","rdseed","sha","smx","ss","sse","sse2","sse3","sse4_1","sse4_2","ssse3","tsc","vaes","vpclmulqdq"],"cache_info":[{"level":1,"cache_type":"data","cache_size":49152,"ways":12,"line_size":64,"tlb_entries":64,"partitioning":1},{"level":1,"cache_type":"instruction","cache_size":32768,"ways":8,"line_size":64,"tlb_entries":64,"partitioning":1},{"level":2,"cache_type":"unified","cache_size":1310720,"ways":10,"line_size":64,"tlb_entries":2048,"partitioning":1},{"level":3,"cache_type":"unified","cache_size":12582912,"ways":8,"line_size":64,"tlb_entries":24576,"partitioning":1}]}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

语言模型及数据集

一、定义 1、语言模型的目标是估计序列的联合概率&#xff0c;一个理想的语言模型就能够基于模型本身生成自然文本。 2、对一个文档&#xff08;词元&#xff09;序列进行建模&#xff0c; 假设在单词级别对文本数据进行词元化。 3、计数建模 &#xff08;1&#xff09;其中…

AI绘画;喂饭进阶!教你如何用Stable Diffusion生成高清建筑手工模型图,一篇文章搞懂什么是Lora模型和CKPT主模型!

前言 刚接触Stable Diffusion不久的你&#xff0c;是否有这样的疑问&#xff1a; Q1: Stable Diffusion中的主模型CKPT是什么&#xff1f; Q2: Stable Diffusion中的Lora模型又是什么&#xff1f; Q3: 在哪儿可以下载好用的AI绘图模型&#xff1f; Q4: Stable Diffusion 如…

【SpringBoot】2 项目搭建

创建项目 1&#xff09;确实本地 jdk 版本 打开命令行窗口&#xff1a;快捷键 Windows R&#xff0c;输入 CMD&#xff0c;敲回车 执行命令&#xff1a;java -version 2&#xff09;在项目 clone 的位置创建 Spring Boot 项目&#xff0c;使用 Maven 进行依赖管理&#xff…

最新爆火的开源AI项目 | LivePortrait 本地安装教程

LivePortrait 本地部署教程&#xff0c;强大且开源的可控人像AI视频生成 1&#xff0c;准备工作&#xff0c;本地下载代码并准备环境&#xff0c;运行命令前需安装git 以下操作不要安装在C盘和容量较小的硬盘&#xff0c;可以找个大点的硬盘装哟 2&#xff0c;需要安装FFmp…

大疆创新2025校招内推

大疆2025校招-内推 一、我们是谁&#xff1f; 大疆研发软件团队&#xff0c;致力于把大疆的硬件设备和大疆用户紧密连接在一起&#xff0c;我们的使命是“让机器有温度&#xff0c;让数据会说话”。 在消费和手持团队&#xff0c;我们的温度来自于激发用户灵感并助力用户创作…

聊聊基于Alink库的主成分分析(PCA)

概述 主成分分析&#xff08;Principal Component Analysis&#xff0c;PCA&#xff09;是一种常用的数据降维和特征提取技术&#xff0c;用于将高维数据转换为低维的特征空间。其目标是通过线性变换将原始特征转化为一组新的互相无关的变量&#xff0c;这些新变量称为主成分&…

react中useMemo钩子函数的使用

1.使用useMemo前展示 import { useState,useMemo } from "react"function kanno(num){console.log(999,num);return num }function UseMemo(){const [count1,setCount1] useState(0)const [count2,setCount2] useState(0)const result kanno(count1)console.log(…

ELK安装(Elasticsearch+Logstash+Kibana+Filebeat)

一、简介 1.1、软件简介 ELK其实是Elasticsearch&#xff0c;Logstash 和 Kibana三个产品的首字母缩写&#xff0c;这三款都是开源产品。 1.1.1、Elasticsearch简介 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析…

magento2 安装win环境和linux环境

win10 安装 安装前提&#xff0c;php,mysql,apach 或nginx 提前安装好 并且要php配置文件里&#xff0c;php.ini 把错误打开 display_errorsOn开始安装 检查环境 填写数据库信息 和ssl信息&#xff0c;如果ssl信息没有&#xff0c;则可以忽略 填写域名和后台地址&#xff0…

花几千上万学习Java,真没必要!(二十九)

1、基本数据类型包装类&#xff1a; 测试代码1&#xff1a; package apitest.com; //使用Integer类的不同方法处理整数。 //将字符串转换为整数&#xff08;parseInt&#xff09;和Integer对象&#xff08;valueOf&#xff09;&#xff0c; //将整数转换回字符串&#xff08;…

Linux下使用gdb进行调试入门级

个人名片&#xff1a; &#x1f393;作者简介&#xff1a;嵌入式领域优质创作者&#x1f310;个人主页&#xff1a;妄北y &#x1f4de;个人QQ&#xff1a;2061314755 &#x1f48c;个人邮箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;个人微信&#xff1a;Vir2025WB…

网络通信---UDP

前两天做了个mplayer项目&#xff0c;今日继续学习 网络内容十分重要&#xff01;&#xff01;&#xff01; 1.OSI七层模型 应用层:要传输的数据信息&#xff0c;如文件传输&#xff0c;电子邮件等&#xff08;最接近用户&#xff0c;看传输的内容类型到底是什么&#xff09; …

Linux使用mjpg-streamer进行图像传输

图像传输是一项在Linux操作系统中比较常见的一个操作&#xff0c;在视频图传时&#xff0c;一般是采用MJPG-streamer来进行图像传输&#xff0c;本文就以树莓派为例子&#xff0c;来示范一个图像传输。 1.树莓派的摄像头激活 首先更新树莓派 sudo apt-get update sudo apt-ge…

【Java基础语法】字符修改,以及equals的用法

前言&#xff1a; 小编这里将上一期String类型进行了补充&#xff0c;添加了字符串的修改&#xff0c;以及equals的用法内容&#xff0c;和hashcode的使用&#xff1b;上一期&#xff1a;http://t.csdnimg.cn/ijiM6 1.字符串的修改 在上一期中我们说到字符串是不能被修改的&am…

详细分析 Bladex中的swagger-resources资源未授权访问的解决方法

目录 1. 问题所示2. 原理分析2.1 RouterFunctionConfiguration 类2.2 SwaggerResourceHandler 类3. 解决方法3.1 网关过滤3.2 去除配置3.3 代码修改4. 彩蛋1. 问题所示 从而也导致资源接口文件泄露 https://xxx/swagger-resources 或者 ip:端口号/swagger-resources 2. 原理分…

matlab笔记 - 最小二乘法拟合直线的原理与实现

最小二乘法拟合直线原理与实现 一、引言二、原理概述1. 建模思路2.误差函数3.求解最优参数 三、matlab实现最小二乘法拟合直线1.直接代码实现2.MATLAB内置函数实现 四、扩展统计学与回归分析经济学工程学图像处理机器学习 一、引言 最小二乘法&#xff08;Least Squares Metho…

ElasticSearch搜索

ES搜索 elastic search 一套搜索引擎技术,主要技术栈包括 Elasticsearch&#xff1a;用于数据存储、计算和搜索 Kibana&#xff1a;用于数据可视化 在数据库模糊查询中,因为不走索引,所以效率很低,而在搜索引擎中,不仅效率高,而且即使出现个别错字,或者用拼音搜索,甚至用同…

自定义Observal返回数据

在写Angular项目的时候&#xff0c;很多都是用的Observal,但是有时候我们在接口还没好 &#xff0c;或者处理有些接口我们想要通过方法在observal返回特定的数据&#xff0c;这个时候要我们可以如下处理&#xff1a; 方法一、通过of返回 方法二&#xff1a;通过Observable的cr…

【Rust】所有权OwnerShip

什么是所有权 rust使用由编译器检查的一些规则构成的所有权系统来管理内存。且这不会影响程序的运行效率。 所有权规则 rust中每一个每一个值都有一个owner。在同一时刻&#xff0c;只能有一个owner。当这个owner超过范围&#xff0c;则该值会被丢弃。 String类型 为什么需…

Unity UGUI 之 自动布局组件

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 本文在发布时间选用unity 2022.3.8稳定版本&#xff0c;请注意分别 1.什么是自动布局组件…