如何在Ubuntu上构建编译LLVM和ISPC,以及Ubuntu上ISPC的使用方法

之前一直在 Mac 上使用 ISPC,奈何核心/线程太少了。最近想在 Ubuntu 上搞搞,但是 snap 安装的 ISPC不知道为什么只能单核,很奇怪,就想着编译一下,需要 Clang 和 LLVM。但是 Ubuntu 很搞,他的很多软件版本是和系统版本挂钩的,默认安装的是 14,这样安装可能会缺东西。没办法,搞吧,顺道研究下这两个的编译和使用。

本文并不是很详细,属于备忘录性质。

准备工作

首先安装需要的工具:

sudo apt-get install git curl cmake xz-utils m4 flex bison python3 libtbb-dev g++-multilib

LLVM

虽然官方文档里说可以用 APT 安装,但是版本不太对。虽然 LLVM 编译需要很长时间,如果你的核心数不够多,那么可以用官方脚本安装,然后自己手动改名称,嗯,也挺麻烦的。
不过现在绝大部分处理器编译的速度都还可以,毕竟大小核心加起来基本上都有十几个了。我曾经在 6 核处理器上编译了一晚上,太慢了。

需要注意 LLVM 编译时间很长而且选项很复杂,这里只说我们需要的 LLVM、Clang 和 LLD,命令如下:

cmake -S llvm -B build -G 'Unix Makefiles' -DLLVM_ENABLE_PROJECTS="clang;lld" -DCMAKE_BUILD_TYPE=Release

这里使用全部的线程构建:

make -j$(nproc)

然后安装命令如下(就是放到该放的地方):

cmake --build . --target install

不过没有复制FileCheck,所以自己挪一下(不知道是我执行其他命令的缘故还是就是这个命令没有操作,反正我手动挪了):

sudo cp FileCheck /usr/local/bin/FileCheck

安装完之后看看llvm-config版本和位置:

$ which llvm-config
/usr/local/bin/llvm-config
$ llvm-config --version
21.0.0git

你也可以对clang等进行相关检查。

如果你想看更多编译情况可以看我的另外一篇博客:

ISPC

首先克隆仓库:

git clone https://github.com/ispc/ispc.git

不建议使用官方的脚本,因为网络问题,下载太慢了。

然后开始编译(不要在 ISPC 项目目录下运行,因为是单独生成build-ispc文件夹存放生成内容):

cmake -B build-ispc ispc

然后开始构建(不要用官方文档里的cmake --build build-ispc,这个只能使用一个核心,太慢了):

cd build-ispc
make -j$(nproc)

然后把生成二进制目录添加到PATH环境变量里:

export PATH="$PATH:<自己改目录>/build-ispc/bin"

关于这部分如果你不熟悉,那么可以看看 macOS在终端上如何直接使用脚本或者下载的程序 - ZhongUncle CSDN。

最后看看ispc版本:

$ ispc --version
Intel(r) Implicit SPMD Program Compiler (Intel(r) ISPC), 1.27.0dev (build commit f988909621671856 @ 20250313, LLVM 21.0.0)

使用 ISPC

这里需要注意,ispc编译的时候使用--pic选项:

ispc SGEMM_kernels.ispc -O3 -o SGEMM_kernels_ispc.o -h SGEMM_kernels_ispc.h --target=avx2-i32x16 --pic

--pic这个选项太冷了,我是翻文档翻出来的,绝了。

然后再使用clang++g++之类的通用编译器编译:

clang++ -O3 SGEMM_main.cpp SGEMM_kernels_ispc.o ../common/tasksys.cpp

否则可能会出现如下问题:

/usr/bin/ld: SGEMM_kernels_ispc.o: relocation R_X86_64_32 against `.text' can not be used when making a PIE object; recompile with -fPIE
/usr/bin/ld: failed to set dynamic section sizes: bad value
collect2: error: ld returned 1 exit status

正确编译后,运行看看:

$ ./a.out 2048 16 4096Usage: SGEMM (optional)[ispc iterations] (optional)[[Matrix A Rows] [Matrix A Columns/ matrix B Rows] [Matrix B Columns]]
./a.out
ispc iterations = 500[default],	 Matrix A Rows = 2048,	 Matrix A Columns/ matrix B Rows = 16, Matrix B Columns = 4096SGEMM_naive_withTasks     5.4232 millisecs    49.4920 GFLOPs Validation: valid.SGEMM_tileShuffle_withTasks     2.7940 millisecs    96.0635 GFLOPs Validation: valid.SGEMM_tileNoSIMDIntrin_withTasks     1.4964 millisecs   179.3685 GFLOPs Validation: valid.SGEMM_tileBlockNoSIMDIntrin_withTasks     1.0402 millisecs   258.0334 GFLOPs Validation: valid.SGEMM_tileBlockNoSIMDIntrin_2_withTasks     1.0505 millisecs   255.5048 GFLOPs Validation: valid.

这时候 CPU 利用率需要满载,如下(注意看./a.out 2048 16 4096这行):
请添加图片描述

题外话

ISPC 是我学过的第一个并行计算语言,并且付出了很大精力去研究和学习。

虽然有感情,但是我并不推荐使用 ISPC,原因很简单,Intel 修改 ISPC 太快太多了,再加上文档并不完善。这样会浪费大量时间在研究和更新上,而不是写代码上,太麻烦了。

希望能帮到有需要的人~

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

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

相关文章

【Spring IOC/AOP】

IOC 参考&#xff1a; Spring基础 - Spring核心之控制反转(IOC) | Java 全栈知识体系 (pdai.tech) 概述&#xff1a; Ioc 即 Inverse of Control &#xff08;控制反转&#xff09;&#xff0c;是一种设计思想&#xff0c;就是将原本在程序中手动创建对象的控制权&#xff…

电感与电容的具体应用

文章目录 一、电感应用1.​电源滤波&#xff1a;2. 储能——平滑“电流波浪”​ ​3. 调谐——校准“频率乐器”​4. 限流——防止“洪水灾害”​二、电容应用1.核心特性理解2.应用场景 三.电容电感对比 一、电感应用 1.​电源滤波&#xff1a; ​场景&#xff1a;工业设备中…

前端面试:axios 请求的底层依赖是什么?

在前端开发中&#xff0c;Axios 是一个流行的 JavaScript 库&#xff0c;用于发送 HTTP 请求。它简化了与 RESTful APIs 的交互&#xff0c;并提供了许多便利的方法与配置选项。要理解 Axios 的底层依赖&#xff0c;需要从以下几个方面进行分析&#xff1a; 1. Axios 基于 XML…

springboot 3 集成Redisson

maven 依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.12</version></parent><dependencies><dependency><groupId>org.red…

C#中继承的核心定义‌

1. 继承的核心定义‌ ‌继承‌ 是面向对象编程&#xff08;OOP&#xff09;的核心特性之一&#xff0c;允许一个类&#xff08;称为‌子类/派生类‌&#xff09;基于另一个类&#xff08;称为‌父类/基类‌&#xff09;构建&#xff0c;自动获得父类的成员&#xff08;字段、属…

Deep research深度研究:ChatGPT/ Gemini/ Perplexity/ Grok哪家最强?(实测对比分析)

目前推出深度研究和深度检索的AI大模型有四家&#xff1a; OpenAI和Gemini 的deep research&#xff0c;以及Perplexity 和Grok的deep search&#xff0c;都能生成带参考文献引用的主题报告。 致力于“几分钟之内生成一份完整的主题调研报告&#xff0c;解决人力几小时甚至几天…

Android SharedPreference 详解

前提&#xff1a;基于 Android API 30 1. 认识 SharedPreference SharedPreference 是 Android 提供的轻量级的&#xff0c;线程安全的数据存储机制&#xff0c;使用 key-value 键值对的方式将数据存储在 xml 文件中&#xff0c;存储路径为 /data/data/yourPackageName/share…

自动化测试脚本语言选择

测试人员在选择自动化测试脚本语言时面临多种选项。Python、Java、C#、JavaScript 和 Ruby 都是常见选择&#xff0c;但哪种语言最适合&#xff1f;本文将详细分析这些语言的特点、适用场景和优劣势&#xff0c;结合行业趋势和社会现象&#xff0c;为测试人员提供全面指导。 选…

【Java项目】基于JSP的KTV点歌系统

【Java项目】基于JSP的KTV点歌系统 技术简介&#xff1a;采用JSP技术、B/S结构、MYSQL数据库等实现。 系统简介&#xff1a;KTV点歌系统的主要使用者分为管理员和用户&#xff0c;实现功能包括管理员&#xff1a;个人中心、用户管理、歌曲库管理、歌曲类型管理、点歌信息管理&a…

element-plus文档解析之Layout布局(el-row,el-col)

前言 这是element-plus提供的响应式布局组件。可以非常方便的实现响应式布局以及快速按比例分块。 例如实现下面的效果&#xff1a; 第一行&#xff1a;宽度占100% 第二行&#xff1a;宽度1&#xff1a;1 第三行&#xff1a;1&#xff1a;1&#xff1a;1 第四行&#xff1a;1…

【Java】——数据类型和变量

个人主页&#xff1a;User_芊芊君子 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录&#xff1a; 1.Java中的注释1.1.基本规则1.2.注释规范 2.标识符3.关键字4.字面常量5.数据类型6.变量6.1变量的概念6.2语法6.3整型变量6.3.1整型变量6.3.2长整…

串口数据记录仪DIY,体积小,全开源

作用 产品到客户现场出现异常情况&#xff0c;这个时候就需要一个日志记录仪、黑匣子&#xff0c;可以记录产品的工作情况&#xff0c;当出现异常时&#xff0c;可以搜集到上下文的数据&#xff0c;从而判断问题原因。 之前从网上买过&#xff0c;但是出现过丢数据的情况耽误…

JVM中是如何定位一个对象的

在 Java 中&#xff0c;对象定位指的是如何通过引用&#xff08;Reference&#xff09;在堆内存中找到对象实例及其元数据&#xff08;如类型信息&#xff09;。JVM 主要通过 直接指针访问 和 句柄访问 两种方式实现&#xff0c;各有其优缺点和应用场景&#xff1a; 一、直接指…

Mac 如何在idea集成SVN

在windows系统上面有我们最为熟悉的小乌龟TortoiseSVN&#xff0c;在mac系统上面则没有什么好用的svn的工具&#xff0c;而且大部分都付费&#xff0c;需要各种渠道找PJ版&#xff0c;费事费力&#xff0c;作为程序员&#xff0c;大部分人应该都会安装开发工具&#xff0c;本文…

批量测试IP和域名联通性

最近需要测试IP和域名的联通性&#xff0c;因数量很多&#xff0c;单个ping占用时间较长。考虑使用Python和Bat解决。考虑到依托的环境&#xff0c;Bat可以在Windows直接运行。所以直接Bat处理。 方法1 echo off for /f %%i in (E:\封禁IP\ipall.txt) do (ping %%i -n 1 &…

LabVIEW变频器谐波分析系统

随着工业自动化的发展&#xff0c;变频器在电力、机械等领域的应用日益广泛&#xff0c;但谐波问题直接影响系统效率与稳定性。传统谐波检测设备&#xff08;如Norma5000&#xff09;精度虽高&#xff0c;但价格昂贵且操作复杂&#xff0c;难以适应现场快速检测需求。本项目基于…

Unity Shader学习总结

1.帧缓冲区和颜色缓冲区区别 用于存储每帧每个像素颜色信息的缓冲区 帧缓冲区包括&#xff1a;颜色缓冲区 深度缓冲区 模板缓冲区 自定义缓冲区 2.ImageEffectShader是什么 后处理用的shader模版 3.computerShader 独立于渲染管线之外&#xff0c;在显卡上运行&#xff0c;大量…

OpenPLC WebServer启动

简述 OpenPLC OpenPLC 可运行在嵌入式系统和普通计算机上&#xff0c;其基本原理是在硬件上安装类似 Linux 的操作系统&#xff0c;并在该环境下运行 OpenPLC 应用程序&#xff0c;从而让用户开发、调试和运行工业自动化控制逻辑。它目前只支持部分 ARM 架构的嵌入式系统&…

【基础知识】回头看Maven基础

版本日期修订人描述V1.02025/3/7nick huang创建文档 背景 项目过程中&#xff0c;对于Maven的pom.xml文件&#xff0c;很多时候&#xff0c;我通过各种参考、仿写&#xff0c;最终做出想要的效果。 但实际心里有些迷糊&#xff0c;不清楚具体哪个基础的配置所实现的效果。 今…

ROS实践(四)机器人SLAM建图(gmapping)

目录 一、SLAM技术 二、常用工具和传感器 三、相关功能包 1. gmapping建图功能包 2. map_server 四、SLAM 建图实验 1. 配置gmapping(launch文件) 2. 启动机器人仿真(含机器人以及传感器) 3. 运行gmapping节点 4. 启动rviz可视化工具 5. 保存地图文件 一、SLAM技…