0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一个使用Java语言实现的向量化BLAS库VectorBLAS

openEuler 来源:openEuler 2023-08-16 10:40 次阅读

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做两次乘加操作;

16f2f720-3a9b-11ee-9e74-dac502259ad0.png
可以看出,向量化操作可以成倍的提升处理效率,目前的向量化寄存器有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`率。

171cf566-3a9b-11ee-9e74-dac502259ad0.png

4. Packing

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

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

172c82c4-3a9b-11ee-9e74-dac502259ad0.png

性能数据

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

174730ec-3a9b-11ee-9e74-dac502259ad0.png

后续规划

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

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

2. 补充完善UT和Benchmark;

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

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

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102994
  • 开源
    +关注

    关注

    3

    文章

    2985

    浏览量

    41718
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61309
  • 机器学习
    +关注

    关注

    66

    文章

    8122

    浏览量

    130561
  • BLAS
    +关注

    关注

    0

    文章

    3

    浏览量

    6653

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

文章出处:【微信号:openEulercommunity,微信公众号:openEuler】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    CRC算法和c语言实现

    CRC算法和c语言实现
    发表于 08-20 19:21

    SQL语言实现数据记录的查询

    绝大部分DBMS都支持SQL语言,LabVIEW数据工具包实现的实质也是基于SQL语言,它为不熟悉SQL语言的用户把SQL
    发表于 07-01 21:25

    如何用VHDL语言实现帧同步的设计?

    帧同步是什么工作原理?如何用VHDL语言实现帧同步的设计?
    发表于 04-08 06:33

    请问怎样实现H.264的量化

    量化的功能有哪些?量化的算法是什么?怎样用Verilog语言实现H.264的量化?如何运用Modelsim对H.264进行仿真?
    发表于 04-28 06:12

    基于Miracl的中国剩余定理C语言实现资料分享

    /article/details/102755680针对大数的中国剩余定理C语言实现、算法介绍二、代码实现三、结果截图、算法介绍中国剩余定理又称孙子定理,是中国人在古代数学上的
    发表于 07-02 06:18

    基于Proteus和C语言实现

    基于Proteus和C语言实现共四题目,有没有人愿意尝试下?
    发表于 07-14 06:20

    如何使用C语言实现模糊PID控制?

    如何使用C语言实现模糊PID控制?
    发表于 09-24 08:54

    C语言实现常用排序算法是什么?

    C语言实现常用排序算法是什么?
    发表于 10-19 06:41

    JAVA语言实现RSA公钥密码算法

    JAVA语言实现RSA公钥密码算法:本文阐述了公开密钥密码体制RSA算法的原理及实现技术。并在此基础上,给出了JAVA语言实现的RSA算法
    发表于 02-10 10:27 58次下载

    DSP算法的c语言实现

    DSP算法的c语言实现,又需要的朋友下来看看。
    发表于 05-09 10:59 0次下载

    4个重要算法C语言实现源代码

    4个重要算法C语言实现源代码
    发表于 06-10 08:00 12次下载

    MATLAB的循环向量化编程方法的详细资料研究

    在简要介绍MATLAB软件基础上,探讨了MABLAB传统循环结构编程思想及循环向量化编程思想。通过实例对循环结构编程与循环向量化编程进行比较。说明了循环向量化编程的优点。循环向量化方法
    发表于 08-28 17:46 4次下载

    CRC校验算法原理及c语言实现

    CRC校验算法原理及c语言实现
    发表于 11-30 10:04 9次下载

    累加校验和C语言实现

    累加校验和C语言实现
    发表于 11-29 18:06 10次下载
    累加校验和C<b class='flag-5'>语言实现</b>

    怎么用C语言实现多态

    这里我想主要介绍下在C语言中是如何实现的面向对象。知道了C语言实现面向对象的方式,我们再联想下,C++中的class的运行原理是什么?
    的头像 发表于 10-12 09:12 1634次阅读