当前位置: 首页 > news >正文

使用 BLAS 调用加快生成的独立代码中的矩阵运算

为了提高某些低级向量生成的代码的执行速度,并 矩阵运算(如矩阵乘法)在独立代码中,指定您 要MATLAB Coder™®生成 BLAS 调用。BLAS 是一个用于低级向量和矩阵计算的软件库,它具有 几个高度优化的机器特定实现。代码生成器使用 CBLAS C 接口来 哎呀。如果指定要生成 BLAS 调用,并且 矩阵函数满足特定条件,代码生成器生成 BLAS 调用。 否则,代码生成器将为矩阵函数生成代码。

对于独立代码中的 BLAS 调用,MATLAB Coder 使用您指定的 BLAS 库。指定针对您的执行环境进行优化的 BLAS 库。

指定 BLAS 库

若要在独立代码中生成 BLAS 调用,必须有权访问 BLAS Callback 类。BLAS 回调类指定 BLAS 库、CBLAS 头文件、 特定 CBLAS 接口使用的某些 C 数据类型,以及编译器和 生成过程的链接器选项。执行下列操作之一:

在命令行中,将代码配置对象属性设置为回调的名称 类。CustomBLASCallback

在 MATLAB 中 Coder app,将 Custom BLAS library callback 设置为回调类的名称。

编写 BLAS 回调类

若要在生成的代码中生成对特定 BLAS 库的调用,请编写 BLAS 回调类。与希望在独立代码中使用此 BLAS 库进行 BLAS 调用的其他人共享回调类。

回调类必须派生自抽象类编码器。BLASCallback的。此示例是回调类的实现,用于与 Windows 平台上的英特尔 MKL BLAS 库集成。mklcallback®

classdef mklcallback < coder.BLASCallbackmethods (Static)function updateBuildInfo(buildInfo, ~)libPath = fullfile(pwd,'mkl','WIN','lib','intel64');libPriority = '';libPreCompiled = true;libLinkOnly = true;libs = {'mkl_intel_ilp64.lib' 'mkl_intel_thread.lib' 'mkl_core.lib'};buildInfo.addLinkObjects(libs, libPath, libPriority, libPreCompiled, ...libLinkOnly);buildInfo.addLinkObjects('libiomp5md.lib',fullfile(matlabroot,'bin', ...'win64'), libPriority, libPreCompiled, libLinkOnly);buildInfo.addIncludePaths(fullfile(pwd,'mkl','WIN','include'));buildInfo.addDefines('-DMKL_ILP64');endfunction headerName = getHeaderFilename()headerName = 'mkl_cblas.h';endfunction intTypeName = getBLASIntTypeName()intTypeName = 'MKL_INT';endend
end

必须提供 、 和 方法。该方法返回 CBLAS 头文件 名字。如果您使用的是其他 BLAS 库,请替换为 CBLAS 头文件的名称。该方法返回 CBLAS 接口使用的整数数据类型的名称。如果你 正在使用不同的 BLAS 库,请替换为 特定于 CBLAS 接口的整数数据类型。该方法提供了 构建过程以链接到 BLAS 库。使用类似于示例中的代码的代码 callback 类指定头文件的位置,BLAS 的完整路径名 库,以及编译器和链接器选项。如果您使用英特尔 MKL BLAS 库,请使用 Link Line Advisor,用于查看哪些库和编译器选项 推荐用于您的用例。getHeaderFilenamegetBLASIntTypeNameupdateBuildInfogetHeaderFilenamemkl_cblas.hgetBLASIntTypeNameMKL_INTupdateBuildInfo

中已经实现了其他三种方法。这些方法是 、 和 。默认情况下,您的回调类 继承了这些实现。在某些 情况下,在定义时,必须使用自己的定义覆盖这些方法 你的回调类。coder.BLASCallbackgetBLASDoubleComplexTypeNamegetBLASSingleComplexTypeNameuseEnumNameRatherThanTypedefcoder.BLASCallback

该方法返回用于 生成代码中的双精度复变量。如果您的 BLAS 库采用 除 和 for 以外的类型 双精度复数组参数,将此方法包含在回调类中 定义。getBLASDoubleComplexTypeNamedoublevoid

function doubleComplexTypeName = getBLASDoubleComplexTypeName()
doubleComplexTypeName = 'my_double_complex_type';
end

替换为 BLAS 库采用的类型 用于双精度复数组参数。my_double_complex_type

该方法返回用于 生成代码中的单精度复变量。如果您的 BLAS 库采用 除 和 for 以外的类型 单精度复数组参数,将此方法包含在回调类中 定义。getBLASSingleComplexTypeNamefloatvoid

function singleComplexTypeName = getBLASSingleComplexTypeName()
doubleComplexTypeName = 'my_single_complex_type';
end

替换为 BLAS 库采用的类型 用于单精度复数组参数。my_single_complex_type

该方法返回 违约。如果 BLAS 库中的枚举类型包含关键字,请重新定义此方法以在回调类定义中返回。useEnumNameRatherThanTypedeffalseenumtrue

function p = useEnumNameRatherThanTypedef()
p = true;
end

包含关键字的生成 C 源代码的摘录如下:enum

enum CBLAS_SIDE t;
enum CBLAS_UPLO b_t;
double temp;
enum CBLAS_TRANSPOSE c_t;
enum CBLAS_DIAG d_t;

通过指定 BLAS 回调类生成 BLAS 调用

此示例演示如何生成在特定 BLAS 库中调用 BLAS 函数的代码。 BLAS 回调类指定 BLAS 库 想要在此示例中使用。useMyBLAS

编写一个 MATLAB 函数,该函数调用函数进行基本矩阵运算。 例如,编写一个乘法函数 两个矩阵和 .myMultiplyAB

function C = myMultiply(A,B) %#codegen
C = A*B;
end

动态定义静态库的代码配置对象 链接库或可执行程序。例如,定义配置 对象,用于 Windows 平台上的动态链接库。

cfg = coder.config('dll');

指定 BLAS 回调类 。useMyBLAS

cfg.CustomBLASCallback = 'useMyBLAS';

回调类必须位于 MATLAB 路径上。

生成代码。指定输入和 是 1000×1000 的双精度数组。AB

codegen myMultiply -args {zeros(1000),zeros(1000)} -config cfg -report

如果 和 足够大,则 代码生成器为矩阵乘法生成 BLAS 调用 功能。AB

在执行环境中找到 BLAS 库

BLAS 库必须在您的执行环境中可用。如果您的 BLAS 库是 shared,则使用环境变量或链接器选项来指定 BLAS 库的位置。

在 Windows 平台上,修改 PATH 环境变量。

在 Linux 平台上,修改 LD_LIBRARY_PATH 环境变量或 使用链接器选项。®rpath

在 macOS 平台上,修改 DYLD_LIBRARY_PATH 环境变量或 使用链接器选项。rpath

若要指定链接器选项,请使用 BLAS 回调类的方法中的 information 方法。为 示例,对于 GCC 编译器:rpathaddLinkFlagsupdateBuildInfo

buildInfo.addLinkFlags(sprintf(‘-Wl,-rpath,“%s”’,libPath));

OpenBLAS 库的使用说明和限制

如果生成的代码包含对 OpenBLAS 库函数的调用,请按照以下步骤操作 这些准则和限制:

如果生成包含对 OpenBLAS 库函数的调用的 C++ 代码, 使用该选项编译它会产生警告。自 禁用编译器选项,将这些行包含在 方法:-pedantic-pedanticupdateBuildInfo

if ctx.getTargetLang() == 'C++'buildInfo.addCompileFlags('-Wno-pedantic');
end

OpenBLAS 不支持 C89/C90 标准。

相关文章:

使用 BLAS 调用加快生成的独立代码中的矩阵运算

为了提高某些低级向量生成的代码的执行速度&#xff0c;并 矩阵运算&#xff08;如矩阵乘法&#xff09;在独立代码中&#xff0c;指定您 要MATLAB Coder™生成 BLAS 调用。BLAS 是一个用于低级向量和矩阵计算的软件库&#xff0c;它具有 几个高度优化的机器特定实现。代码生成…...

一台服务器,最大支持的TCP连接数是多少?

一个服务端进程最大能支持多少条 TCP 连接&#xff1f; 一台服务器最大能支持多少条 TCP 连接&#xff1f; 一、原理 TCP 四元组的信息&#xff1a;源IP、源端口、目标IP、目标端口。 一个服务端进程最大能支持的 TCP 连接个数的计算公式&#xff1a;最大tcp连接数客户端的IP…...

微信小程序云开发教程——墨刀原型工具入门(编辑页面)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…...

flutter打包app

Flutter 打包APP &#xff08;Android & IOS&#xff09;_encountered error while building for device.-CSDN博客 使用命令行 keytool -genkey -v -keystore ../key -keyalg RSA -keysize 2048 -validity 10000 -alias key 将在文件根目录上一层生成key文件&#xff0…...

力扣543. 二叉树的直径

Problem: 543. 二叉树的直径 文章目录 题目描述思路复杂度Code 题目描述 思路 1.最大直径 左子树的最大深度 右子树的最大深度&#xff1b; 2.定义一个变量maxDiameter记录最大直径&#xff0c;并编写一个递归函数maxDepth&#xff0c;利用树的后序遍历每次递归求取leftMax&a…...

python网络爬虫教程笔记(1)

系列文章目录 文章目录 系列文章目录前言一、爬虫入门1.爬虫是什么&#xff1f;2.爬虫工作原理3.爬虫基本原理4.工作流程5.HTTP请求6.HTTP响应7.HTTP原理&#xff1a;证书传递、验证和数据加密、解密过程解析8.Urllib.request库的使用9.TCP3次握手&#xff0c;4次挥手过程 总结…...

C# 异步返回类型详解

在现代软件开发中&#xff0c;异步编程已经成为一种重要的编程范式&#xff0c;尤其是在需要与I/O密集型操作交互的上下文中&#xff0c;比如网络请求、数据库操作等。C# 语言提供了强大的异步支持&#xff0c;使得异步编程变得更加简单和直观。本文将详细介绍C#中异步返回类型…...

BAT等大厂必问技术面试题,【2024Android最新学习路线

下面分享一下我在爱奇艺的面经 面试前的话&#xff1a;在面试时一定不要受前面没有过的面试的影响&#xff0c;一定要有一个好的心态&#xff0c;不要面试还没开始就自己把自己思绪搞乱了 一共进行了4轮面试 爱奇艺一面 50min 项目 主要介绍了以前做过的项目&#xff0c;分析…...

72. 编辑距离【leetcode】/动态规划难

72. 编辑距离 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1&#xff1a; 输入&#xff1a;word1 “horse”, word2 “ros”…...

【MySQL】视图、索引

目录 视图视图的用途优点视图的缺点创建视图查看视图修改视图删除视图注意事项 索引索引的原理索引的数据结构二分查找法Hash结构Hash冲突&#xff01;&#xff01;&#xff01; B树二叉查找树 存在问题改造二叉树——B树降低树的高度 B树特点案例继续优化的方向 改造B树——B树…...

反编译java生成的.class文件

java代码编译后生成xxx.class文件&#xff0c;有时候需要反编译这个class文件看代码是怎么写的&#xff0c;可以使用下面这个工具。 工具已经上传到资源&#xff0c;链接&#xff1a; https://download.csdn.net/download/weixin_42556307/88915887 具体使用如下&#xff1a; …...

Cookie 探秘:了解 Web 浏览器中的小甜饼

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

Python线性代数数字图像和小波分析之二

要点 数学方程&#xff1a;数字信号和傅里叶分析&#xff0c;离散时间滤波器&#xff0c;小波分析Python代码实现及应用变换过程&#xff1a; 读取音频和处理音频波&#xff0c;使用Karplus-强算法制作吉他音频离散傅里叶计算功能和绘制图示结果计算波形傅里叶系数正向和反向&…...

LC.exe”已退出,代码为 -1

尽管网络上已经有许多详尽的说明和资料&#xff0c;但鉴于个人对大量文字的理解有反感&#xff0c;我就写一个更为直观、简洁的方式来呈现我的解决方案。 1.问题图片。 2.删除licenses.licx 3.问题解决...

springboot + jpa + 达梦数据库兼容 Mysql的GenerationType.IDENTITY主键生成策略

导入达梦数据库对hibernate的方言包 <dependency><groupId>com.dameng</groupId><artifactId>DmDialect-for-hibernate5.6</artifactId><version>8.1.2.192</version></dependency>配置文件中添加方言配置和主键生成策略配置…...

Redis优化与应用

Redis性能调优 - Redis的性能调优是一个比较复杂的过程&#xff0c;需要从多个方面进行优化&#xff0c;如内存使用、命令使用等。 - 案例&#xff1a;减少不必要的持久化操作。默认情况下&#xff0c;Redis会执行RDB和AOF两种持久化方式。如果不需要持久化&#xff0c;或者可…...

深入了解Kafka的文件存储原理

Kafka简介 Kafka最初由Linkedin公司开发的分布式、分区的、多副本的、多订阅者的消息系统。它提供了类似于JMS的特性&#xff0c;但是在设计实现上完全不同&#xff0c;此外它并不是JMS规范的实现。kafka对消息保存是根据Topic进行归类&#xff0c;发送消息者称为Producer&…...

RabbitMQ 高级

在昨天的练习作业中&#xff0c;我们改造了余额支付功能&#xff0c;在支付成功后利用RabbitMQ通知交易服务&#xff0c;更新业务订单状态为已支付。 但是大家思考一下&#xff0c;如果这里MQ通知失败&#xff0c;支付服务中支付流水显示支付成功&#xff0c;而交易服务中的订单…...

音视频开发之旅——音频基础概念、交叉编译原理和实践(LAME的交叉编译)(Android)

本文主要讲解的是音频基础概念、交叉编译原理和实践&#xff08;LAME的交叉编译&#xff09;&#xff0c;是基于Android平台&#xff0c;示例代码如下所示&#xff1a; AndroidAudioDemo 音频基础概念 在进行音频开发的之前&#xff0c;了解声学的基础还是很有必要的。 声音…...

直播美颜SDK开发指南:构建个性化的主播美颜工具

本篇文章&#xff0c;小编将带您深入了解如何构建个性化的主播美颜工具&#xff0c;从而为用户提供更优质的直播体验。 一、美颜技术概述 在开始SDK的开发之前&#xff0c;我们首先需要了解美颜技术的基本原理。美颜技术通常包括肤色检测、人脸检测、特征点定位、滤镜处理等步…...

羊大师揭秘,羊奶有哪些好处和不足呢?

羊大师揭秘&#xff0c;羊奶有哪些好处和不足呢&#xff1f; 羊奶的好处主要包括&#xff1a; 营养丰富&#xff1a;羊奶中含有多种人体所需的营养成分&#xff0c;如蛋白质、脂肪、碳水化合物、矿物质和维生素等。尤其是蛋白质含量高&#xff0c;且易于人体吸收利用。 增强免…...

鸿蒙问题之CustomDialog后持久化@state数据崩溃

开发需求&#xff1a;有一个字符串数组&#xff0c;可以通过弹框编辑其中的某个字符串&#xff0c;编辑完成后更新数组并持久化这个数组。 这个需求算是很简单&#xff0c;很常见的需求了。但是&#xff0c;开发过程中却遇到了一个不小的难题。 我的数组内容需要在组件中显示…...

微服务高性能通信技术-gRPC实战落地

在微服务架构中&#xff0c;服务之间的通信是至关重要的。为了实现高性能、低延迟和跨语言的服务间通信&#xff0c;gRPC是一个流行的选择。gRPC是一个开源的、高性能的、通用的RPC&#xff08;远程过程调用&#xff09;框架&#xff0c;基于HTTP/2协议和Protocol Buffers序列化…...

洛阳旅游攻略

洛阳旅游攻略 第一天&#xff08;抵达当天&#xff09;&#xff1a; 1.先将行李放到酒店—2.老城十字街&#xff08;打车可能会堵车&#xff09;—3.洛邑古城—4.丽景门&#xff08;步行&#xff09; 第二天&#xff1a; 1.早起吃早餐—&#xff08;打车三十分钟&#xff0c…...

图论例题解析

1.图论基础概念 概念 &#xff08;注意连通非连通情况&#xff0c;1节点&#xff09; 无向图&#xff1a; 度是边的两倍&#xff08;没有入度和出度的概念&#xff09; 1.完全图&#xff1a; 假设一个图有n个节点&#xff0c;那么任意两个节点都有边则为完全图 2.连通图&…...

图解 TCP 拥塞控制

文章目录 什么是拥塞控制拥塞控制算法慢启动拥塞避免快速恢复 TCP拥塞控制状态机 什么是拥塞控制 拥塞控制是一种 确保网络中的数据包以可持续的速率传输 的机制&#xff0c;避免因为数据包太多而超过网络当前的承载能力&#xff0c;导致网络性能下降&#xff0c;甚至产生大量…...

Nginx配置文件的整体结构

一、Nginx配置文件的整体结构 从图中可以看出主要包含以下几大部分内容&#xff1a; 1. 全局块 该部分配置主要影响Nginx全局&#xff0c;通常包括下面几个部分&#xff1a; 配置运行Nginx服务器用户&#xff08;组&#xff09; worker process数 Nginx进程PID存放路径 错误…...

[SpringCloud] OpenFeign核心架构原理 (三)

文章目录 1.SpringCloud是如何整合Feign的1.1 将FeignClient接口注册到Spring中1.2 FeignClientFactoryBean相关 1.SpringCloud是如何整合Feign的 核心组件重新实现, 支持更多的SpringCloud生态的功能。将接口动态代理对象注入到Spring容器中。 1.1 将FeignClient接口注册到S…...

elementUI Table组件点击取当前行索引

在使用element UI Table组件时&#xff0c;需要点击取当前行索引&#xff0c;并删除当前行&#xff0c;看了element UI 文档好象没有这个的&#xff0c;仔细看下发现当前行索引是在scope里的$.index里。 element UI文档&#xff1a;https://www.uihtm.com/element/#/zh-CN/comp…...

组基轨迹建模 GBTM的介绍与实现(Stata 或 R)

基本介绍 组基轨迹建模&#xff08;Group-Based Trajectory Modeling&#xff0c;GBTM&#xff09;&#xff08;旧名称&#xff1a;Semiparametric mixture model&#xff09; 历史&#xff1a;由DANIELS.NAGIN提出&#xff0c;发表文献《Analyzing Developmental Trajectori…...