【openEuler创新项目探索】一个Java端的向量化BLAS库VectorBLAS

VectorBLAS简介

VectorBLAS是一个使用Java语言实现的向量化BLAS高性能库,目前已在openEuler社区开源。

VectorBLAS通过循环展开、矩阵分块和内存布局优化等算法优化,对BLAS函数进行了深度优化,并利用VectorAPI JDK提供的多种向量化API实现。

可以理解为:VectorBLAS = VectorAPI + BLAS。

BLAS简介:

BLAS(Basic Linear Algebra Subprograms)是进行向量和矩阵等基本线性代数操作的数值库,是LAPACK(Linear Algebra Package)的一部分。

在高性能计算领域中被广泛应用,由此衍生出大量优化版本,如OpenBLAS、Intel的Intel MKL等优化版本。

主要支持三个级别的运算:分别支持向量与向量、向量与矩阵、矩阵与矩阵的相关操作。

VectorAPI简介:

VectorAPI是Java端为实现SIMD向量化功能提供的一个抽象层,从JDK16开始发布,目前已孵化到第六代(JDK21)。

VectorAPI提供的能力包括:

  1. 定义更清晰及准确的向量化API,使用户更直接的实现向量化;

  2. 与平台无关:支持AArch64和x86等平台,支持NEON、SVE、AVX等多种向量化指令,一份代码多处可用;

应用场景:

目前BLAS库在大数据、HPC和机器学习等高性能计算中被广泛使用。例如大数据组件Spark中的多种机器学习算法(如:KMeans、 LDA、 PCA、 Bayes、 GMM、 SVM等)都用到了BLAS函数接口gemm、 gemv、 axpy、 dot、 spr等。

主要优化方法

1. VectorAPI向量化

BLAS库中的函数分为矢量-矢量、矢量-矩阵、矩阵-矩阵的计算,其中多数场景为对数组、矩阵进行计算,因此使用向量化进行优化,一次处理多个数据,提升效率,下面以daxpy函数为例:

daxpy => y = alpha * x + y, 其中alpha为常数,x和y为一维向量,数据类型均为double;

原生朴素实现:对x和y中的元素逐个计算;

向量化实现:以256位宽的寄存器为例,一次可以处理2个double类型,即一次对alpha、x和y做两次乘加操作;

图片可以看出,向量化操作可以成倍的提升处理效率,目前的向量化寄存器有128、256、512等大小的位宽,SVE等指令集甚至最高可支持2048位。

2. 循环展开

循环展开是一种循环转换技术, 通过减少或消除控制程序循环的指令,来减少计算开销,这种开销包括增加指向数组中下一个索引或者指令的指针算数等,还可以减少循环的次数,每次循环内的计算也可以利用CPU的流水线提升效率;

JDK中的JIT即时编译器也有针对循环进行自动优化,尤其是使用int, short, 或者char变量作为计数器的计数循环(counted loops)

VectorBLAS主要分析函数特性,通过把循环改造为counted loop,或手动对关键循环进行展开,以此提高执行效率;

3. 矩阵分块

矩阵分块是一种cache优化手段,当数组、矩阵的规模较大的时候,在N层循环中的跨度太大时,无法fit in the cache,数据则会被清出了缓存,造成较高的cache miss率;
通过矩阵分块,可以将小块数据锁在L1/L2 Cache中,提高cache命中,降低cache miss率。

图片

4. Packing

Packing优化又称为内存布局优化,因矩阵在数组中一般是按列存储或者按行存储,若计算时不是按照整行整列的顺序进行,那么就需要跨列或跨行读取数据。

Packing指的是在内存中新开一块空间,在这块空间内重新排布数据,使得数据的读取可以变得连续,减少cache miss,提升读取速度,Packing一般与矩阵分块搭配使用。

图片

性能数据

现有版本基于鲲鹏服务器测试验证,性能相较于业界同类库F2jBLAS/ludovic.netlib都有提升,如下图所示:

图片

后续规划

本项目已开源在openEuler社区,当前版本实现了BLAS库中的主要接口,后续规划如下:

  1. 支持Level1、Level2、Level3中更多的函数接口;

  2. 补充完善UT和Benchmark;

  3. 对于不同平台/指令集的调优;

4.结合Spark MLlib等机器学习算法库进行性能优化。

欢迎感兴趣的朋友们参与进来,代码地址:https://gitee.com/openeuler/vectorBlas

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

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

相关文章

利用Jmeter做接口测试(功能测试)全流程分析

利用Jmeter做接口测试怎么做呢?过程真的是超级简单。 明白了原理以后,把零碎的知识点填充进去就可以了。所以在学习的过程中,不管学什么,我一直都强调的是要循序渐进,和明白原理和逻辑。这篇文章就来介绍一下如何利用…

开源vue动态表单组件

一、项目简介 vueelement的动态表单组件,拖拽组件到面板即可实现一个表单 二、实现功能 支持拖拽 支持输入框 支持文本框 支持数字输入框 支持下拉选择器 支持多选框 支持日期控件 支持开关 支持动态表格 支持上传图片 支持上传文件 支持标签 支持ht…

vue中实现echarts三维散点图

需要安装 echarts 同时引入 echarts-gl 我安装的版本: "echarts": "^5.3.2", "echarts-gl": "^2.0.9", import Vue from "vue"; import * as echarts from "echarts"; Vue.prototype.$echarts echa…

常用Web漏洞扫描工具汇总(持续更新中)

常用Web漏洞扫描工具汇总 常用Web漏洞扫描工具汇总1、AWVS,2、OWASP Zed(ZAP),3、Nikto,4、BurpSuite,5、Nessus,6、nmap7、X-ray还有很多不是非常知名,但可能也很大牌、也较常见的。…

生成对抗网络(GAN):在图像生成和修复中的应用

文章目录 什么是生成对抗网络(GAN)?GAN在图像生成中的应用图像生成风格迁移 GAN在图像修复中的应用图像修复 拓展应用领域总结 🎉欢迎来到AIGC人工智能专栏~生成对抗网络(GAN):在图像生成和修复…

Visual Studio Code 终端配置使用 MySQL

Visual Studio Code 终端配置使用 MySQL 找到 MySQL 的 bin 目录 在导航栏中搜索–》服务 找到MySQL–>双击 在终端切换上面找到的bin目录下输入指令 终端为Git Bash 输入命令 ./mysql -u root -p 接着输入密码,成功在终端使用 MySQL 数据库。

Annual Inspection

机动车年检流程【交警12123】APP 到【检查地方】门口墙上贴着 然后上缴钥匙,等待,本次等待不到半小时搞定,速度很满意, 发现检测人员把你的里程数纠正了。 给你的行驶证,打印这些字样:检验有效期至XXXX 再给…

ChatGPT帮助高职院校学生实现个性化自适应学习与对话式学习

一、学习层面:ChatGPT帮助高职院校学生实现个性化自适应学习与对话式学习 1.帮助高职院校学生实现个性化自适应学习 数字技术的飞速发展引起了教育界和学术界对高职院校学生个性化自适应学习的更多关注和支持,其运作机制依赖于人工智能等技术&#xff0…

SLAM从入门到精通(开始篇)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 很多同学喜欢学习linux,但是他们只是把linux当成是一个嵌入式技术在学习,而不是当成工具在使用。平时,要么是自…

Samba服务器

目录 一、什么是Samba? 二、Samba进程 三、Samba主要功能 四、Samba工作流程 五、Samba安全级别 六、Sam主配置文件/etc/samba/smb.conf 七、Samba服务配置案例 一、什么是Samba? Samba可以让linux计算机和windows计算机之间实现文件和打印机资源共享的一…

解决D盘的类型不是基本,而是动态的问题

一、正确的图片 1.1图片 1.2本人遇到的问题 二、将动态磁盘 转为基本盘 2.1 基本概念,动态无法转化为基本,不是双向的,借助软件 网址:转换动态磁盘到普通磁盘_检测到计算机本地磁盘为动态分区_卫水金波的博客-CSDN博客 2.2分区…

软考:中级软件设计师:数据库恢复与备份,故障与恢复,反规范化

软考:中级软件设计师:数据库恢复与备份 提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对未来更多的可能性 关于互联网大厂的笔试面试,都是需要细心准备…

Linux 下 Java Socket 编程报 java.net.Exception:Permission denied (权限不足)

本人用Linux部署springboot项目时遇见这个错误,原因很简单,就是端口号没有选对。 在linux系统中,端口号再1024以下的需要root权限,只要把端口改成大于1024的就可以了,但避开一些软件的默认端口,如Tomcat的8…

Midjourney学习(三)6个高级应用

使用Remix Mode在原图片的基础上进行二次创作 通过prompt得到大图之后,点击Make Variations按钮,输入Remix Prompt,即可得到意想不到的效果! 局部内容重绘 通过局部重绘可以实现对画面内容更加精细化的控制,同样也是需…

设计模式—策略模式

目录 一、定义 二、特点 三、优点 四、缺点 五、实例 六.涉及到的知识点 1、一个类里面有哪些东西? 2、类和实例 什么是类? 什么是实例? 什么是实例化? 3、字段和属性 什么是字段? 属性是什么&#xff1…

新的雅思口语6分标准

目录 新的雅思口语6分标准 要有细节,要有充分的话题词汇资源 要拥有具象思维能力,要有画面感 下义词是什么意思? 方法:现在时未来时 (形成时态多样)观点解释 原因要有排他性 "Kick off" 是…

windows系统服务器在不解锁屏幕不输入密码的前提下,电脑通电开机启动程序。

在控制面板中找到“管理工具”中的 “任务计划程序”,打开“任务计划程序”窗口。如图: 双击打开任务计划程序,空白出右键创建基本任务,或者点击最右侧的创建基本任务。 输入名称,点击下一步。 先选择计算机启动时&a…

开启智能时代:深度解析智能文档分析技术的前沿与应用

开启智能时代:深度解析智能文档分析技术的前沿与应用 本章主要介绍文档分析技术的理论知识,包括背景介绍、算法分类和对应思路。通过本文学习,你可以掌握:1. 版面分析的分类和典型思想 2. 表格识别的分类和典型思想 3. 信息提取的…

JavaScript 手写题

基础手写 全排列(力扣原题) 要求以数组的形式返回字符串参数的所有排列组合。 注意: 字符串参数中的字符无重复且仅包含小写字母返回的排列组合数组不区分顺序const _permute string > {const result []const map new Map()const df…

百万级并发IM即时消息系统(3)配置数据初始化和前后端交互

04_配置数据初始化及前后端交互_哔哩哔哩_bilibili 1.配置文件 创建一个config文件夹以及一个app.yaml配置文件。 该文件专门存放一些关键配置,如mysql DNS路径和redis的addr账号密码等。 后期可以创建一个工具包和一些初始化方法,专门用来加载这些配…