在华为开发者空间,使用鲲鹏BoostKit数学库优化程序性能
1.简单4步,带你用华为云MetaStudio制作数字人短片2.【AI应用开发全流程】使用AscendCL开发板完成模型推理3.使用Python实现深度学习模型:序列到序列模型(Seq2Seq)4.无需搭建环境,零门槛带你体验Open-Sora文生视频应用5.一文教你在MindSpore中实现A2C算法训练6.代码高手的过节秘籍:CodeArt Snap帮写代码,灵感弹指间实现7.星火闪耀,与AI同行丨华为开发者大会2024社区活动重磅上线!8.基于Ascend C的FlashAttention算子性能优化最佳实践9.快速识别你家的猫猫狗狗,教你用ModelBox开发AI萌宠应用10.首批!华为云盘古研发大模型通过代码大模型评估,获当前最高等级11.详解联邦学习中的异构模型集成与协同训练技术12.养猪大户必备!教你用ModelBox开发一个AI数猪应用13.【重磅】华为云盘古大模型5.0,正式发布!14.【HDC 2024】探索、交流、成长,华为云助力开发者成就星辰大海梦想15.大模型重塑软件开发,华为云AI原生应用架构设计与实践分享16.基于Python和TensorFlow实现BERT模型应用17.如何玩转云端文生视频、0码构建AI应用?华为云专家来揭秘18.深度解读昇腾CANN多流并行技术,提高硬件资源利用率19.一文为你深度解析LLaMA2模型架构20.结合RNN与Transformer双重优点,深度解析大语言模型RWKV21.万字长文解析AI Agent技术原理和应用22.深度解读昇腾CANN内存复用技术,降低网络内存占用23.教你基于MindSpore用DCGAN生成漫画头像24.零代码教你安装部署Stable Diffusion 3,一键生成高质量图像25.深度解读昇腾CANN模型下沉技术,提升模型调度性能26.田间地头“有智慧”,华为云助力盈禾嘉田打造病虫害防治新模式27.基于MindSpore实现BERT对话情绪识别28.降低大模型推理87%时延!华为云论文入选顶会USENIX ATC'2429.【毕业季】给你的职场首秀加点“码力”:零码创建专属AI Agent30.程序员必备开发神器:领取云主机,零码创建专属AI Agent31.技术解读:华为云如何携手昇腾、鸿蒙等根生态,助力开发者技术创新32.《华为云DTSE》期刊免费下载:10个案例读懂云上架构升级策略33.总奖金高达10万元!华为算法精英实战营“亲和任务调度系统”来啦!34.基于Ascend C的Matmul算子性能优化最佳实践35.AI大模型高效开发神器来了 ,解读ModelArts 8大能力36.简单几步,基于云主机快速为Web项目添加AI助手37.零代码构建AI Agent,解读华为云AI原生应用引擎的架构与实践38.他们用AI,为另外一群人做了双“眼睛”39.对话4位技术大咖,探秘华为开发者空间打破壁垒,实现跨平台协作40.蛇年开工送大礼,邀您一键体验DeepSeek系列新模型41.DeepSeek带来的Deepshock,一次看懂DeepSeek42.【文末有惊喜】仅四步!在华为开发者空间快速部署DeepSeek43.DeepSeek V3/R1满血版,上线华为云
44.在华为开发者空间,使用鲲鹏BoostKit数学库优化程序性能
45.如何在保障精度的同时,轻量级部署DeepSeek?46.在华为开发者空间,调用DeepSeek实现代码自动生成摘要:通过本实验,开发者可以快速掌握鲲鹏数学库的安装与使用,并对所涉及的数学库性能表现有清晰认识。
本文分享自华为云社区《【开发者空间实践指导】使用鲲鹏BoostKit数学库优化程序性能》,作者:开发者空间小蜜蜂。
一、案例介绍
鲲鹏数学库(KML, Kunpeng Math Library)是基于鲲鹏平台优化的高性能数学函数库,由多个子库组成,广泛应用于科学计算、HPC等领域。本实验将以KML_VML和KML_BLAS为例,介绍鲲鹏数学库获取和编译,然后使用C语言编写demo进行性能测试查看KML优化前后的性能效果。通过本实验,用户可以快速掌握鲲鹏数学库的安装与使用,并对所涉及的数学库性能表现有清晰认识。
二、免费领取云主机
如您还没有云主机,可点击链接 ,根据领取指南进行操作。
如您已领取云主机,可直接开始实验。
三、实验流程

说明:
1. 自动部署并连接鲲鹏服务器;
2. 安装数学库;
3. 修改环境变量;
4. 数学库性能测试。
四、实验资源
本次实验预计花费总计0元。
五、实验步骤
5.1 自动部署鲲鹏服务器
本实验中,使用云主机提供的鲲鹏沙箱资源,只需要执行简单的自动部署命令即可拉起一台免费的鲲鹏服务器。
在云主机桌面右键选择“Open Terminal Here”,打开终端命令窗口。
输入自动部署命令,命令如下:
hcd deploy --password abcd1234! --time 1800
命令的参数说明:
• password:password关键字后设置的是鲲鹏服务器的root用户密码,命令中给出的默认为abcd1234!,开发者可以替换成自定义密码(至少8个字符)。
• time:time关键字后面设置的为鲲鹏服务器的可用时间,单位为秒,至少600秒。当前实验预估需要20分钟,为了保证时间充足,在命令中申请的时间为30分钟,即1800秒。
记录下自动部署后生成的弹性公网IP地址。

5.2 安装数学库
使用命令登录到鲲鹏服务器,命令如下:
ssh root@鲲鹏服务器公网IP
输入密码,密码为步骤2.1中自动部署命令行中“--password”后面的参数,命令中给出的默认为abcd1234!,如果没有修改,就使用abcd1234!进行登录,如果设置了自定义密码,直接输入自定义的密码(注意:输入过程中密码不会显示,密码输入完成按回车键结束)。
使用命令下载数学库软件包,本次案例使用的是1.7.0版本。
wget https://repo.oepkgs.net/openeuler/rpm/openEuler-20.03-LTS-SP3/extras/aarch64/Packages/b/boostkit-kml-1.7.0-1.aarch64.rpm
解压软件包。
rpm2cpio boostkit-kml-1.7.0-1.aarch64.rpm | cpio -div
添加软链接,使用ln -s命令创建软链接,类似于Windows中的快捷方式,它是一个特殊的文件,其内容是指向另一个文件或者目录的路径,当访问软链接时,系统会根据软链接中的路径找到实际指向的目标文件或目录来进行操作。
下面三组命令分别创建了libkspblas.so、libkvml.so和libkm.so三个软链接,分别指向根据find命令找到对应实际的kspblas.so、kvml.so和km.so文件
cp -R /root/usr/local/kml/ /usr/local/ cd /usr/local/kml ln -s 'find ./ -name *kspblas.so* -type f' ./libkspblas.so ln -s 'find ./ -name *kvml.so* -type f' ./libkvml.so ln -s 'find ./ -name *km.so* -type f' ./libkm.so
5.3 修改环境变量
在 Linux 系统中,LD_LIBRARY_PATH是一个重要的环境变量,它用于指定动态链接库(.so文件)的搜索路径。当程序在运行时需要加载动态链接库,系统会首先在默认的系统库路径中查找,然后会按照LD_LIBRARY_PATH环境变量所指定的路径顺序进行查找。
将多个与/usr/local/kml相关的库目录添加到LD_LIBRARY_PATH环境变量中,是因为程序依赖于这些目录下的动态链接库来正确运行。通过将这些目录添加到LD_LIBRARY_PATH,可以确保程序在运行时能够找到所需的库文件。
echo 'export LD_LIBRARY_PATH=/usr/local/kml/lib/kblas/locking:$LD_LIBRARY_PATH' >> /etc/profile echo 'export LD_LIBRARY_PATH=/usr/local/kml/lib:$LD_LIBRARY_PATH' >> /etc/profile echo 'export LD_LIBRARY_PATH=/usr/local/kml/lib/kblas/nolocking:$LD_LIBRARY_PATH' >> /etc/profile echo 'export LD_LIBRARY_PATH=/usr/local/kml/lib/kblas/omp:$LD_LIBRARY_PATH' >> /etc/profile echo 'export LD_LIBRARY_PATH=/usr/local/kml/lib/kblas/pthread:$LD_LIBRARY_PATH' >> /etc/profile echo 'export LD_LIBRARY_PATH=/usr/local/kml/lib/kvml/multi:$LD_LIBRARY_PATH' >> /etc/profile echo 'export LD_LIBRARY_PATH=/usr/local/kml/lib/kvml/single:$LD_LIBRARY_PATH' >> /etc/profile echo 'export LD_LIBRARY_PATH=/usr/local/kml/lib/kspblas/multi:$LD_LIBRARY_PATH' >> /etc/profile echo 'export LD_LIBRARY_PATH=/usr/local/kml/lib/kspblas/single:$LD_LIBRARY_PATH' >> /etc/profile
执行命令使环境生效。
source /etc/profile
检查环境变量。
env | grep LD_LIBRARY_PATH

5.4 数学库性能测试
1. KML_VML测试
矢量数学库(Vector Math Library)借助计算密集型核心数学函数(幂函数、三角函数、指数函数、双曲函数、对数函数等)的矢量实施显著提升应用速度。
使用命令创建测试文件test_sin.c文件。
cd
vi test_sin.c
进入到vim编辑器界面后,按下“i”键后,复制以下代码粘贴到编辑器中,复制完成后按下“ESC”键输入“:wq”,退出编辑器界面,该段代码主要功能是:初始化长度为100000的向量src,分别用计时器对循环使用系统函数库的sin函数求解以及调用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 = 100000 * (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 = 100000 * (end.tv_sec - start.tv_sec) + end.tv_usec - start.tv_usec; printf("Calculate Time with KML_VML: %ld us \n", t); return 0; }
编译文件, 编译时添加动态库和头文件所在路径,并链接系统数学库和KML_VML动态库。
gcc test_sin.c -o test -L/usr/local/kml/lib/kvml/single -lkvml -lm -I/usr/local/kml/include -fopenmp -std=c99
使用ldd指令检查程序依赖库是否准确链接。
ldd test

执行可执行文件,进行性能对比。
./test
结果显示,对于一个长度为100000的数组,用C语言的for循环实现求正弦函数值,需要6666微秒,而使用KML_VML仅需要779微秒,性能提升8倍。

2. KML_BLAS测试
BLAS(Basic Linear Algebra Subprograms)提供了一系列基本线性代数运算函数的标准接口,包括矢量线性组合、矩阵乘以矢量、矩阵乘以矩阵等功能。BLAS已被广泛的应用于工业界和科学计算,成为业界标准。KML_BLAS库提供BLAS函数的C语言接口。
使用命令创建测试文件test_gemv.c文件。
vi test_gemv.c
进入到vim编辑器界面后,按下“i”键后,复制以下代码粘贴到编辑器中,复制完成后按下“ESC”键输入“:wq”,退出编辑器界面,该段代码主要功能是:初始化规模为1000*300的矩阵A,长度为300的向量x,长度为1000的向量y1和y2,分别用计时器对按照矩阵-向量的成家规则实现算法求解,即y=alpha*A*x+beta*y,以及调用KML_BLAS提供的函数cblas_dgemv求解,记录两种方法的耗时,对比KML_BLAS与手动实现矩阵乘加的性能。
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <sys/time.h> #include "kblas.h" #define M 1000 #define N 300 int main() { double alpha = 1.0; double beta = 1.0; double (*A)[N] = (double (*)[N])malloc(M * N * sizeof(double)); double *x = (double *)malloc(N * sizeof(double)); double *y1 = (double *)malloc(M * sizeof(double)); double *y2 = (double *)malloc(M * sizeof(double)); srand((unsigned int)time(NULL)); for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { A[i][j] = (double)rand() / RAND_MAX; } } for (int i = 0; i < N; i++) { x[i] = (double)rand() / RAND_MAX; } for (int i = 0; i < M; i++) { y1[i] = (double)rand() / RAND_MAX; y2[i] = (double)rand() / RAND_MAX; } // 方法一:按照矩阵-向量的乘加规则实现算法求解 struct timeval start, end; long t; gettimeofday(&start, NULL); for (int i = 0; i < M; i++) { double sum = 0.0; for (int j = 0; j < N; j++) { sum += A[i][j] * x[j]; } y1[i] = alpha * sum + beta * y1[i]; } gettimeofday(&end, NULL); t = 100000 * (end.tv_sec - start.tv_sec) + end.tv_usec - start.tv_usec; printf("Calculate Time without KML_BLAS: %ld us \n", t); // 方法二:调用KML_BLAS提供的函数cblas_dgemv求解 gettimeofday(&start, NULL); cblas_dgemv(CblasRowMajor, CblasNoTrans, M, N, alpha, (const double *)A, N, x, 1, beta, y2, 1); gettimeofday(&end, NULL); t = 100000 * (end.tv_sec - start.tv_sec) + end.tv_usec - start.tv_usec; printf("Calculate Time with KML_BLAS: %ld us \n", t); return 0; }
编译文件,编译时添加动态库和头文件所在路径,并链接KML_BLAS动态库。
gcc test_gemv.c -g -o test2 -L /usr/local/kml/lib/kblas/locking/ -lkblas -I /usr/local/kml/include -std=c99
使用ldd指令检查程序依赖库是否准确链接。
ldd test2

执行可执行文件,进行性能对比。
./test2
结果显示,计算一个1000*300的矩阵-向量乘加运算,用C语言的for循环实现,需要1904微秒,而使用KML_BLAS仅需要145微秒,性能提升13倍。

至此,本次实验全部完成。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
2024-02-17 华为云GES助力九洲平台:探索确定性运维的新实践
2024-02-17 想设计一个高并发的消息中间件前,先熟悉一下这些知识点
2023-02-17 理论+实践,揭秘昇腾CANN算子开发
2023-02-17 Serverless Streaming:毫秒级流式大文件处理探秘
2022-02-17 延迟任务场景,该如何提高吞吐量和时效性
2022-02-17 MySQL 是如何实现RC事务隔离级别的
2022-02-17 理论+算法+实战,教你如何实现亿级流量下的分布式限流