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.hqwc.cn/news/333486.html

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

相关文章

【华为】IPsec VPN 实验配置(动态地址接入)

【华为】IPsec VPN 实验配置(动态地址接入) 注意实验需求配置思路配置命令拓扑R1基础配置配置第一阶段 IKE SA配置第二阶段 IPsec SA ISP_R2基础配置 R3基础配置配置第一阶段 IKE SA配置第二阶段 IPsec SA PCPC1PC2 检查建立成功查看命令清除IKE / IPsec…

读写锁ReentrantReadWriteLock的原理

解决线程安全问题使用ReentrantLock就可以,但是ReentrantLock是独占锁,某时只有一个线程可以获取该锁,而实际中会有写少读多的场景,显然ReentrantLock满足不了这个需求,所以ReentrantReadWriteLock应运而生。 Reentra…

CSS 发光输入框动画

<template><view class="content"><input placeholder="请输入..." class="input" /> </view> </template><script></script><style>/* 设置整个页面的背景颜色为 #212121 */body{background-c…

Image - 体积最小的 base64 encode 1*1透明图片,透明背景图片base64编码

背景 前端开发时&#xff0c;有些<img>标签的src属性的值来源于接口&#xff0c;在接口获取结果之前&#xff0c;这个src应该设置为什么呢&#xff1f; 误区&#xff1a;设置为# 有人把src设置为<img src"#" />。 这是有问题的&#xff0c;浏览器解析…

Hyperledger Fabric 权限策略和访问控制

访问控制是区块链网络十分重要的功能&#xff0c;负责控制某个身份在某个场景下是否允许采取某个操作&#xff08;如读写某个资源&#xff09;。 常见的访问控制模型包括强制访问控制&#xff08;Mandatory Access Control&#xff09;、自主访问控制&#xff08;Discretionar…

LabVIEW在旋转机械故障诊断中的随机共振增强应用

在现代工业自动化领域&#xff0c;准确的故障诊断对于保障机械设备的稳定运行至关重要。传统的故障检测方法往往因噪声干扰而难以捕捉到微弱的故障信号。随着LabVIEW在数据处理和系统集成方面的优势日益凸显&#xff0c;其在旋转机械故障诊断中的应用开始发挥重要作用&#xff…

Javaweb之Mybatis的动态SQL的详细解析

3. Mybatis动态SQL 3.1 什么是动态SQL 在页面原型中&#xff0c;列表上方的条件是动态的&#xff0c;是可以不传递的&#xff0c;也可以只传递其中的1个或者2个或者全部。 而在我们刚才编写的SQL语句中&#xff0c;我们会看到&#xff0c;我们将三个条件直接写死了。 如果页面…

APP广告变现技术——广告分层(瀑布流)

广告变现必不可少的广告来源就是AdNetwork&#xff0c;开发者要想让应用在广告变现上获取更多的收益&#xff0c;需要接入更多的ADNetwork&#xff0c;把每一个广告位卖给出价最高的平台&#xff0c;那是如何做到的&#xff1f; 开发者接入多家广告源后&#xff0c;流量应该怎…

实战环境搭建-linux下安装悟空CRM

下载地址如下: 链接:https://pan.baidu.com/s/1OI9EA8Nc8ymWlERS9i0vjg?pwd=ws5c 提取码:ws5c 上传crm的程序包,如下图: 输入 unzip 72crm-java-master.zip 进行解压 create database crm9; use crm9; source /opt/72crm-java-master/docs/crm9.sql 修改/home/wukongcr…

Elasticsearch:升级到 elasticsearch-py 8.x 的 10 个理由

作者&#xff1a;来自 Elastic 公司 Quentin_Pradet 早在 2022 年 2 月&#xff0c;当 Elasticsearch 8.0 发布时&#xff0c;Python 客户端也发布了 8.0 版本。 它是 7.x 客户端的部分重写&#xff0c;并附带了许多不错的功能&#xff08;概述如下&#xff09;&#xff0c;但也…

SpringBoot请求参数加密、响应参数解密

SpringBoot请求参数加密、响应参数解密 1.说明 在项目开发工程中&#xff0c;有的项目可能对参数安全要求比较高&#xff0c;在整个http数据传输的过程中都需要对请求参数、响应参数进行加密&#xff0c;也就是说整个请求响应的过程都是加密处理的&#xff0c;不在浏览器上暴…

Spark---RDD(Key-Value类型转换算子)

文章目录 1.RDD Key-Value类型1.1 partitionBy1.2 reduceByKey1.3 groupByKeyreduceByKey和groupByKey的区别分区间和分区内 1.4 aggregateByKey获取相同key的value的平均值 1.5 foldByKey1.6 combineByKey1.7 sortByKey1.8 join1.9 leftOuterJoin1.10 cogroup 1.RDD Key-Value…