OpenBLAS 的静态库命名分析 — — 以 x86_64 的静态库为例

在不同的机器上,生成的openblas生成的lib的名字可能是这样的:

libopenblas_skylakexp-r0.3.26.dev.a
libopenblas_skylakexp-r0.3.26.dev.so

也可能是这样的:

liblapack_static_haswellp-r0.3.25.dev.a

libopenblas_haswellp-r0.3.26.dev.so

这不同的名字是如何的来的呢?

1,找到定义

假如安装进 lib/ 中的文件是 libopenblas_skylakexp-r0.3.26.dev.a
那么这个名字是怎么获得的呢?比如其中的core架构名 skylakex

从安装入手,发生在 这个makefile文件中OpenBLAS/Makefile.install
第100行左右:

#for install static library
ifneq ($(NO_STATIC),1)@echo Copying the static library to $(DESTDIR)$(OPENBLAS_LIBRARY_DIR)@install -m644 $(LIBNAME) "$(DESTDIR)$(OPENBLAS_LIBRARY_DIR)"@cd "$(DESTDIR)$(OPENBLAS_LIBRARY_DIR)" ; \
#    ln -fs $(LIBNAME) $(LIBPREFIX).$(LIBSUFFIX)
endif

可以知道,被cp的文件,是以 $(LIBNAME) 给出的,安装到文件夹 "$(DESTDIR)$(OPENBLAS_LIBRARY_DIR)" 下面。


接下来需要追踪 $(LIBNAME) 这个变量的定义来源。这个名字的定义出现在 Makefile.system 中:
 

LIBNAME        ?= $(LIBPREFIX)_$(LIBCORE)p$(REVISION).$(LIBSUFFIX)

2,分拆定义
LIBNAME        ?= $(LIBPREFIX)_$(LIBCORE)p$(REVISION).$(LIBSUFFIX)
由四部分组成: LIBPREFIX  LIBCORE  REVISION  LIBSUFFIX

先把比较直接定义的三部分找到:
    其中

LIBPREFIX = lib$(LIBNAMEBASE) 

即 liblapack_static;
    而,

REVISION = -r$(VERSION)

,而

VERSION = 0.3.25.dev


    而,

LIBSUFFIX = a

最后剩下 LIBCORE 的定义;
在不同的机器上,其定义的值并不相同,
比如在一台 Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz 的服务器中,
LIBCORE=haswell,这定义在 Makefile.conf 中。
如果在一台 Genuine Intel(R) CPU 0000%@ 的服务器中,哈哈哈,这是什么cpu呢?其实是一颗测试版的 i9-10980xe cpu;
LIBCORE=skylakex,也是定义在 Makefile.conf 中。

问题在于,Makefile.conf 的内容为何不同呢?

原来 Makefile.conf 这个文件是OpenBLAS构建系统动态生成的一个文件。

3,Makefile.conf 的由来

在 Makefile.prebuild 中有一个定义:
 

TARGET_MAKE = Makefile.conf

而且还有如下关键代码,其余部分省去了:

    ./getarch 0 >> $(TARGET_MAKE)./getarch 1 >> $(TARGET_CONF)

而,其中  


这便是 LIBCORE 的定义由来。

那么 getarch 这个文件是怎么来的呢?


它也是构建而来的:
 

getarch : getarch.c cpuid.S dummy $(CPUIDEMU)avx512=$$(./c_check$(SCRIPTSUFFIX) - - "$(CC)" $(TARGET_FLAGS) $(CFLAGS) | grep NO_AVX512); \rv64gv=$$(./c_check$(SCRIPTSUFFIX) - - "$(CC)" $(TARGET_FLAGS) $(CFLAGS) | grep NO_RV64GV); \$(HOSTCC) $(HOST_CFLAGS) $(EXFLAGS) $${avx512:+-D$${avx512}} $${rv64gv:+-D$${rv64gv}} -o $(@F) getarch.c cpuid.S $(CPUIDEMU)

这个构建比较有意思,值得仔细分析一下。
特别是为何上面的那颗测试版cpu,在cat /proc/cpuinfo 中都没有得到型号,却在这里可以获得架构号。

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

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

相关文章

面试算法91:粉刷房子

题目 一排n幢房子要粉刷成红色、绿色和蓝色,不同房子被粉刷成不同颜色的成本不同。用一个n3的数组表示n幢房子分别用3种颜色粉刷的成本。要求任意相邻的两幢房子的颜色都不一样,请计算粉刷这n幢房子的最少成本。例如,粉刷3幢房子的成本分别为…

Linux-添加虚拟内存,不添加硬盘方式操作

在linux中,当物理内存mem不足时,就会使用虚拟内存(swap分区) 例如增加2G虚拟内存,操作如下: 1.查看内存大小 [rootlocalhost ~]# free -m 2.创建要作为swap分区的文件:增加1GB大小的交换分区,则命令写法如下,其中的cou…

1. 认识SPSS

使用的是IBM SPSS statistics 25,参考教材《统计分析与SPSS的应用》 一、安装和启动 具体安装过程是参考spss下载以及安装详细教程这篇文章,下载安装包然后按他的步骤获取用户许可证即可。 二、主要窗口 数据编辑器窗口data editor 是SPSS的主程序窗…

【C++之单例模式】

C之单例模式 前言介绍1、单例模式是什么?1.1 实现单例模式的三个要点1.2 单例模式分类 2. 懒汉式2.1 懒汉实现:基础方法2.2 懒汉实现:基于单锁2.3 懒汉实现:基于双重检测锁2.4 懒汉实现:基于双重检测锁和资源管理2.4.1…

ssm基于Vue的戏剧推广网站论文

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统戏剧推广信息管理难度大,容错率低&#xff0c…

代码随想录day23 二叉岁终章

669. 修剪二叉搜索树 题目 给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。 思考 这题有个…

2024年中职网络安全——Windows操作系统渗透测试(Server2105)

Windows操作系统渗透测试 任务环境说明: 服务器场景:Server2105服务器场景操作系统:Windows(版本不详)(封闭靶机)需要环境加Q 目录 1.通过本地PC中渗透测试平台Kali对服务器场景进行系统服务…

Docker 部署后端项目自动化脚本

文章目录 开机自启动docker打包后端项目Dockerfile文件脚本文件使用 开机自启动docker systemctl enable dockersystemctl is-enabled docker打包后端项目 这里的项目位置是target同级目录 1.在项目下面新建一个bin目录 新建一个package.txt 写入下方代码后 后缀改为.bat ec…

配置git服务器

第一步: jdk环境配置 (1)搜索【高级系统设置】,选择【高级】选项卡,点【环境变量】 (2)在【系统变量】里面,点击【新建】 (3)添加JAVA_HOME环境变量JAVA_HO…

展开运算符(Spread Operator)

展开运算符(Spread Operator)是ES6中引入的一种语法,使用三个连续的点(...)表示。它可以在多种场合下使用,主要用途是“展开”数组或对象中的元素或属性。 使用展开运算符的几种常见情景: 在函…

小程序学习基础(页面加载)

打开首页&#xff0c;然后点击第一个按钮进去心得页面 进入心得页面以后 第一个模块是轮播图用的是swiper组件&#xff0c;然后就是四个按钮绑定点击事件&#xff0c;最后就是下拉刷新&#xff0c;下拉滚动&#xff0c;上拉加载。代码顺序wxml,js,wcss,json。 <!--pages/o…

【开源商城推荐-LGPL-3.0】ts-mall 聚惠星商城

dts-shop: 聚惠星商城 DTS-SHOP&#xff0c;基于 微信小程序 springboot vue 技术构建 &#xff0c;支持单店铺&#xff0c;多店铺入驻的商城平台。项目包含 微信小程序&#xff0c;管理后台。基于java后台语言&#xff0c;已功能闭环&#xff0c;且达到商用标准的一套项目体…

金和OA C6 MailTemplates.aspx SQL注入漏洞

文章目录 产品简介漏洞概述指纹识别漏洞利用修复建议 产品简介 金和OA协同办公管理系统软件&#xff08;简称金和OA&#xff09;&#xff0c;本着简单、适用、高效的原则&#xff0c;贴合企事业单位的实际需求&#xff0c;实行通用化、标准化、智能化、人性化的产品设计&#…

Day05

19.用户与权限管理 19.1 用户管理 MySQL用户可以分为普通用户和root用户。root用户是超级管理员&#xff0c;拥有所有权限&#xff0c;包括创建用户、删除用户和修改用户的密码等管理权限&#xff1b;普通用户只拥有被授予的各种权限。 MySQL提供了许多语句用来管理用户账号…

kotlin的注解

在Kotlin中&#xff0c;注解&#xff08;Annotations&#xff09;是一种用于在程序代码中添加元数据的特殊标记。它们提供了对代码的描述性信息&#xff0c;但本身并不会影响程序的运行。注解可以应用于类、方法、属性等程序元素上&#xff0c;用于提供关于这些元素的额外信息。…

Linux自动化部署脚本

1:最近项目部署比较频繁终于熬不住了 就有下面的这东西 #!/bin/sh #报错停止运行 set -e # 获取tomcat的PID TOMCAT_PID$(ps -ef | grep tomcat | grep -v grep | awk {print $2}) # tomcat的启动文件位置 START_TOMCAT/mnt/tomcat/bin/startup.sh # 项目文件部署位置 PROJECT…

php 的数据类型

目录 1.整型 2.浮点型 3.布尔类型 4.字符串 5.数组 6.NULL 7.对象 8.资源类型 查看变量对应值的类型&#xff1a; 1.使用“gettype(传入一个变量var)”来显示变量var的类型; 只会显示类型 2.使用“var_dump(传入一个变量var)”来显示变量var的类型; 会显示具体内容打…

5 - 视图|存储过程

视图&#xff5c;存储过程 视图视图基本使用使用视图视图进阶 存储过程创建存储过程存储过程进阶存储过程参数循环结构 视图 视图是虚拟存在的表 表头下的数据在真表里 表头下的数据存储在创建视图时 在select命令访问的真表里 优点&#xff1a; 安全数据独立简单 用户无需关…

git常用指令及应用案例

一、常用指令 用户配置 git config --global user.name "bettyaner" git config --global user.email bettyaner163.com工作常用指令 // 初始化仓库 git init // 对状态的跟踪、分为内容状态和文件状态 // 内容状态标示内容文件的改变&#xff0c;有三个区域&…

ADS仿真 之 容差/良率分析

之所以要进行容差分析&#xff0c; 是因为任何电子元器件均存在一定的误差&#xff0c; 如电感、电容的精度等。 例如一个标称为2.0nH0.1nH的电感&#xff0c;代表的意思产品有99.74%的概率落在2.0nH0.1nH范围内&#xff0c; 即满足6σ &#xff0c;σ是标准偏差或者说方差&…