【云驻共创】沉默加速度是我的脚步,鲲鹏加速库是你的板斧

举报
HappyWendy666 发表于 2021/06/30 07:58:08 2021/06/30
【摘要】 鲲鹏BoostKit加速库是提供基于ARM指令深度优化和基于鲲鹏KAE(鲲鹏硬件加速引擎)开发的加速库。对常见的开源库做进一步深度性能优化,同时补齐鲲鹏生态链上缺失的关键性能库,为鲲鹏应用提供极致的性能保障。

引言

加速库是什么? 为什么要使用加速库呢? 我先给大家讲个故事。

从前有两个程序员分别叫袁猿和方芳 ,他们在一家养殖场做技术开发。 有一天,老板让袁猿算一个关于兔子繁殖的问题。

设有一对新生的兔子,从第三个月开始他们每个月都生一对兔子,新生的兔子从第三个月开始又每个月生一对兔子。按此规律,并假定兔子没有死亡, 1 年后共有多少个兔子? 10 年后,又如何?

袁猿想这是一个斐波那契数列问题啊 , 于是他很快写出代码

int64_t fib(int n){
   if(n <= 2){
      return (int64_t)1;
   }
   return fib(n-1) + fib(n-2);
}

提交后, 老板 输入了 n 值为 64 ,等了半天也没有结果。 老板说 : “ 这运行时间也太长了,兔子都等不了了,毕竟兔子急了会咬人。 ” 袁猿解释说 : “ 老板,您看这 CPU 主频为 1GHz ,所以运行速度慢,要不您给我换台电脑吧。 ” 老板望着那黑色的运行窗口, 想着他养殖场里为数不多的兔子, 叹了口气,转身离开了 。

这时方芳走到袁猿身边说: “ 其实 ,这个算法的时间复杂度 O(2ⁿ ) 。 当 CPU 主频为 1GHz 时,令 n=64, 需要 1 天才能计算出来,令 n=90, 需要 3 世纪才能计算出来。 你可以通过优化算法来解决这个问题。 ”

袁猿觉得方芳说的对 , 抓了抓头发, 决定重新写一个算法 。

int64_t fib(int n){
   if(n <2){
      return (int64_t)1;
   }
   int64_t f = 0, g = 1;
   while(1 < n--){
      g = g + f;
      f = g - f;
   }
   return g;
}

他分别测试了 n=64 或 n=90 ,这回结果很快就出来了,因为这个算法的时间复杂度 为 O(n) 。 方芳向他投来了敬佩的目光 ,这个故事先讲到这里了。我们可以想想,如果要提升运算速度,通常有两种办法

1. 升级 CPU

这会耗费更多资源来提升计算效率,性价比低,且如果资源已经接近顶配,提升有限

2. 从软件入手,优化算法

无需增加硬件成本,上层应用无感知,性价比高

那么 对于每个 CPU ,无论是计算单元,读写单元还是存储单元, 如果能高效的将他们并行起来,就可以实现不增加硬件成本,提升运算速度。 这就是加速库要做的事情。

因此, 加速库是结合计算机体系结构,通过改变软件代码的数据结构和算法来提升基础软件的计算效率。也可以利用计算机芯片的多样性,通过软件开发,发挥专有芯片的高性能特点,在特定领域做一些性能提升。

使用加速库来解决问题,可以提升软件计算效率重构摩尔定律,同时也是常见系统工程的方法之一

今天就给大家介绍一下鲲鹏 BoostKit 加速库。

二、 鲲鹏 BoostKit 加速库全景概述

鲲鹏应用使能套件 BoostKit , 是基于硬件、基础软件和应用软件的全栈优化,提供高性能开源组件 基础加速软件包 应用加速软件包 ,使能应用极致性能。


其中基础加速软件包 中又覆盖 4 个子系统的性能优化方法、 7 类加速库 和 3 大优化方向的加速算法 。


鲲鹏 BoostKit 加速库 提供基于 ARM 指令 深度优化和基于鲲鹏 KAE (鲲鹏硬件加速引擎) 开发的加速库 。对常见的开源库做进一步深度性能优化,同时补齐鲲鹏生态链上缺失的关键性能库,为鲲鹏应用提供极致的性能保障。

覆盖系统库、压缩、加解密、媒体、数学库、存储、网络等 7 加速库,为大数据加解密、分布式存储压缩、视频转码等应用场景提供高性能加速。

BoostKit 可分为三种类别:

ARM 支持的加速库 :开源社区提供 ARM 支持的加速库,在鲲鹏平台完成验证

硬加速库 ( 基于 KAE) :提供领先业界的性能加速能力 ,包含 ZIP( 硬加速 - 压缩 ) HPRE( 硬加速 - 非对称加解密 ) SEC( 硬加速 - 对称加解密 )

软加速库 基于鲲鹏指令深度优化的加速库 ,并向开源社区开放


三、 鲲鹏 BoostKit 加速库实现原理及应用

3.1 KAE 加速库原理

鲲鹏处理器内置的硬件加速器,通过 License 商业授权使用。 KAE 使能及调用流程为:

1. BMC 子系统管理芯片加速子系统的 License, 当系统初始化时, BMC License 传递给 BIOS 系统

2. BIOS 子系统解析 License 信息,并根据解析结果对芯片加速子系统进行使能控制,并上报加速器 ACPI 表到内核

3. 上层应用基于 OpenSSL / Zlib 加载库调用鲲鹏加速引擎,并通过寄存器操作调用芯片加速子系统

采用分层架构,内核态安全运行,代码面向社区开源

基于华为自 UACCE 加速器内核框架,避免传统内核调用方式的路径损耗

100% 继承 OpenSSL Zlib 接口,应用层代码逻辑无需调整,使用简单

3.2 KAE 加速库应用

1. WEB 场景

Https 是 Web 场景下的通用协议,其中 RSA2048 是 WEB 解决方案中的一个性能瓶颈 。 通过使用 RSA 硬加速 Nginx , 相比主流加速卡性能提升 35%+

2. 分布式场景

分布式场景中有很多压缩和解压缩的调用, 通过使用 KAE 硬压缩后,大数据块混合读写性能领先其他平台 15%+

3. 大数据场景

数据在文件系统中可能会被加密存储 , 业务系统和数据库之间的交互需要数据加解密。 数据加解密是为了数据安全,但这不是大数据场景中主要的内容。 使用 KAE 后, CPU 的使用率降低了 15% 。这样 CPU 可以处理更多业务相关的内容。

3.3 鲲鹏指令加速库原理及应用

1. Avx2Neon

AVX2Neon 是一款接口集合库。当使用 Intrinsic 类接口的应用程序从传统平台迁移到鲲鹏计算平台时,由于各个平台的 Intrinsic 函数定义不同,需要逐一对于 Intrinsic 函数重新进行适配开发。针对该问题, 加速库 提供了 AVX2Neon 模块,将传统平台的 Intrinsic 接口集合使用鲲鹏指令重新实现,并封装为独立的接口模块( C 语言头文件方式),以减少大量迁移项目重复开发的工作量。

X86 Instrinsic 函数总共 6000 多个,目前已完成其中 5000+ 的函数接口适配

对常用的 SSE/AVX Instrinsics 函数进行深度优化适配,使用鲲鹏 920 指令以及 ARM Instrinsics 函数进行深度性能优化

使用方式 1 : 适配函数以头文件方式集成到 Porting Advisor 工具,通过工具识别迁移点,并提供一键式快速迁移 。

使用方式 2 : 鲲鹏开发人员通过开源社区下载 AVX2Neon 源码,集成到自己的软件中。源码中引入头文件,即可像之前一样继续使用 Instrinsic 函数。

#include “ avx2neon.h ”

附源码地址: https://github.com/kunpengcompute/AvxToNeon


相关名词说明

Intrinsic : 这里指的是基于 gcc 编译的一种内建函数,一般是对处理器高级指令(如向量化指令等)的 C 内联函数格式封装,各个处理器厂商的接口定义存在较大差异。

SIMD 指令:单指令多数据流,在 SIMD 型芯片的 CPU 中, 能够复制多个操作数,并把它们打包在大型寄存器的一组指令集 。 适用多媒体等数据密集型的运算。

Neon 是适用于ARM Cortex-A 系列处理器的一种 128 位 SIMD 扩展结构。

AVX 是 X86 下的 SIMD 指令 。

2. Hyperscan

HyperScan 是一款高性能的正则表达式匹配库,它遵循 libpcre 库通用的正则表达式语法,拥有独立的 C 语言接口。在 HyperScan 正式发布的 5.2.1 版本的基础上,参考华为鲲鹏微架构特征,重新设计核心接口的实现机制,并完成了开发和性能优化,推出适合鲲鹏计算平台的软件包。使用鲲鹏计算平台的用户可以根据自己业务需求下载本软件包,用来提升业务在鲲鹏平台上的稳定性和性能。 编译接口平均性能提升 10+% ,扫描接口平均性能提升 40+%

HyperScan 鲲鹏计算平台软件版本主要增加了以下功能:

增加鲲鹏计算平台分支,且完全兼容 armv8-a ,同时确保 x86 平台使用不受影响

通过使用 NEON 指令、内联汇编、数据对齐、指令对齐、内存数据预取、静态分支预测、代码结构优化等方法,实现在鲲鹏计算平台的性能提升

应用场景为 :入侵检测系统、互联网营销类、网络威胁检测、 DPI 解决方案

3. 媒体加速库 ( HMPP )

HMPP 分为 HMPPI 和 HMPPS ,其中 HMPPI 正在研发中。

目前信号库 HMPPS 完成 1000+ 个 函数接口开发包括以下方面:

基础向量运算 :逻辑移位运算、向量转换、 向量统计、采样函数、初始化函数

信号变换 FFT CZT 、功率谱、希尔伯特

滤波 :卷积、 FIR 滤波、重采样、中值滤波、自相关

窗口函数 Blackman Hann Kaiser Hamming Bartlett

数学运算 :算数运算、三角运算、 、根、指数运算

应用场景为 :运动跟踪,雷达信号,图像分析,视频增强, AI 加速,医学扫描,通信。

4. 媒体加速库 ( HW265 )

HW265 视频编码器是符合 H.265/HEVC 视频编码标准、基于鲲鹏处理器 NEON 指令加速的华为自研 H.265 视频编码器。

HW265 8bit 标准版实现相比 X86 开源 X265 1 5 倍的性能优势

HW265 8bit 清低码版实现平均 50% 的码率节省

极致压缩 High Quality

  3fps, 适用于热门影片 / 短视频等场景

通用编码 Balance

  25fs, 适用于 OTT 点播场景

快速编码 Speed

  60fps, 适用于秀场,游戏,在线教育等场景

HW265 提供视频编码库,可集成到 FFmpeg 开源转码框架中。

5. 鲲鹏数学库 ( Kunpeng Math Library ,简称 KML )

KML 是基于华为鲲鹏处理器的高性能数学计算加速库,提供了基于鲲鹏平台优化的数学函数,由基础线性代数库( KML_BLAS )、稀疏线性代数库( KML_SPBLAS )、向量运算库( KML_VML )、基础数学库( KML_MATH ) 、快速傅里叶变换库( KML_FFT )等五个子库组成,可根据业务需求集成使用 。

6. Glibc

Glibc 是 C 运行库,是 Linux 系统中 最底层、 最基础的软件库,其它任何运行 库几乎 都会依赖于 Glibc 。

主要对内存、字符串、锁等接口基于华为 鲲鹏 920 处理器微架构特点进行了加速优化, 充分利用鲲鹏 Neon 指令优势提高算力。

memcmp / memset / memcpy / memrchr / strcpy / strlen / strnlen 已合入 GNU 社区,随 Glibc2.31 主干版本发布,同步推送 openEuler 社区,已随 openEuler1.0 发布。

基于主流 OS 集成的 Glibc2.17 发布补丁,接口平均性能提升 35 + %

Glibc 的 优化方法 为 :

使用 Q 寄存器替代 X 寄存器 Q 寄存器 位宽 128 X 寄存器 位宽 64

读写内存对齐

结合鲲鹏 CPU 芯片分支预测特性

算法优化

四、 使用 鲲鹏 BoostKit 加速库

基于 KAE 的加速库

RPM 包: 在发布 OS 兼容性范围内,可以直接下载 RPM 包使用 。

源码: 鲲鹏社区下载源码后 , 编译使用 。

鲲鹏指令加速库

开源加速库可在鲲鹏社区下载源码并编译使用 。

定向开源的加速库需联系技术支持申请源码后编译使用 。

鲲鹏 BoostKit 加速库地址

https://www.hikunpeng.com/zh/developer/devkit/library

开发 者贡献 与交流

Github : https://github.com/kunpengcompute/Kunpeng

鲲鹏众智 : https://www.hikunpeng.com/ecosystem/ecology_remit

电子邮箱: kunpengcompute@huawei.com

五、实验测试

5.1 KML_VML 测试

初始化长度为 100000 的向量 src ,分别用两种方法求向量中每个元素的正弦函数值:
1 、循环使用系统函数库的 sin 函数求解
2 、调用 KML_VML 提供的向量三角函数 vdsin 求解

分别用计时器记录两种方法消耗的时间,对比 KML_VML 与系统函数库的性能。

#include <stdio.h>
#include <sys/time.h>
#include <math.h>
#include "kvml.h"
#define LEN 100000

int main()
{
    double src[LEN] = {0};
    double dst1[LEN] = {0};
    double dst2[LEN] = {0};
    for (int i = 0; i < LEN; i++) {
        src[i] = i;
    }
    struct timeval start, end;
    long t;
	gettimeofday(&start, NULL);
    for (int i = 0; i < LEN; i++) {
        dst1[i] = sin(src[i]);
    }
	gettimeofday(&end, NULL);
    t = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec;
    printf("Calculate Time without KML_VML: %ld us\n", t);

	gettimeofday(&start, NULL);
    vdsin(LEN, src, dst2);
    gettimeofday(&end, NULL);
    t = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec;
    printf("Calculate Time with KML_VML: %ld us\n", t);

    return 0;
}

结果显示,对于一个长度为 100000 的数组,用 C 语言的 for 循环实现求正弦函数值,需要 4541 微秒,而使用 KML_VML 仅需要 804 微秒,性能提升 6 倍左右。

5.2 KML_BLAS 测试

初始化规模为 1000*300 的矩阵 A ,长度为 300 的向量 x ,长度为 1000 的向量 y1 和 y2 。分别用两种方法求矩阵 - 向量乘加运算,即 y=alpha*A* x+beta *y :

1 、按照矩阵 - 向量的乘加规则实现算法求解

2 、调用 KML_BLAS 提供的函数 cblas_dgemv 求解

分别用计时器记录两种方法消耗的时间,对比 KML_BLAS 与 手动实现 矩阵乘加的性能。

#include <stdio.h>
#include <sys/time.h>
#include "kblas.h"
#define M 1000
#define N 300

int main()
{
    double A[M * N] = {0};
    double x[N] = {0};
    double y1[M] = {0};
    double y2[M] = {0};
    for (int i = 0; i < M * N; i++) {
        A[i] = i;
    }
    for (int i = 0; i < N; i++) {
        x[i] = i;
    }
    for (int i = 0; i < M; i++) {
        y1[i] = 1;
        y2[i] = 1;
    }
    double alpha = 1.2;
	double beta = 2.5;

    struct timeval start, end;
    long t;
    gettimeofday(&start, NULL);
    for (int i = 0; i < M; i++) {
        double tmp = 0;
        for (int j = 0; j < N; j++) {
            tmp += (A[i * N + j] * x[j]);
        }
        y1[i] = alpha * tmp + beta * y1[i];
    }
    gettimeofday(&end, NULL);
    t = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec;
    printf("Calculate Time without KML_BLAS: %ld us\n", t);

    gettimeofday(&start, NULL);
    cblas_dgemv(CblasRowMajor, CblasNoTrans, M, N, alpha, A, N, x, 1, beta, y2, 1);
    gettimeofday(&end, NULL);
    t = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec;
    printf("Calculate Time with KML_BLAS: %ld us\n", t);
}

结果显示,计算一个 1000*300 的矩阵 - 向量乘加运算,用 C 语言的 for 循环实现,需要 1734 微秒,而使用 KML_BLAS 仅需要 245 微秒,性能提升 6 倍左右。

实验地址 : https://lab.huaweicloud.com/testdetail_488


领先开源软件10%+性能的鲲鹏加速库技术详解,点此回看 

查看活动:【华为云社区内容共创者火热招募中】第五弹

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。