关于前端:openEuler创新项目探索一个Java端的向量化BLAS库VectorBLAS

3次阅读

共计 1812 个字符,预计需要花费 5 分钟才能阅读完成。

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 中的多种机器学习算法(如:KMeansLDAPCABayesGMMSVM等)都用到了 BLAS 函数接口 gemmgemvaxpydotspr 等。

次要优化办法

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

正文完
 0