在生成的代码中加速矩阵运算MATLAB函数块
提高为某些低级向量和矩阵操作(如矩阵乘法)生成的代码的执行速度MATLAB函数块,指定您希望代码生成器生成的内容布拉斯特区调用。BLAS是一个用于低级向量和矩阵计算的软件库,它有几个高度优化的特定于机器的实现。代码生成器使用CBLASC接口到BLAS。如果指定希望生成BLAS调用,并且矩阵函数的输入数组满足某些条件,则代码生成器将生成BLAS调用。否则,代码生成器为矩阵函数生成代码。
代码生成器使用您指定的BLAS库。指定一个布拉斯特区图书馆它针对您的执行环境进行了优化。
指定BLAS库
要在生成的代码中生成BLAS调用,必须访问BLAS回调类。BLAS回调类指定BLAS库、CBLAS头文件、特定CBLAS接口使用的某些C数据类型以及构建过程的编译器和链接器选项。
若要指示您想要生成BLAS调用并使用特定的BLAS库,请指定BLAS回调类的名称。2 .在“配置参数”对话框中设置自定义BLAS库回调到回调类的名称。
编写BLAS回调类
要在生成的代码中生成对特定BLAS库的调用,请编写BLAS回调类。与希望在独立代码中使用此BLAS库进行BLAS调用的其他人共享回调类。
回调类必须派生自抽象类编码器。布拉斯特区Callback
.这个例子是回调类的实现mklcallback
用于与英特尔MKLWindows上的BLAS库®平台。
classdefMklcallback <编码器。BLASCallback方法(静态)函数updateBuildInfo(buildInfo, ~) libPath = fullfile(pwd, ~)“mkl”,“赢”,“自由”,“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“本”,...“win64”), libPriority, libPreCompiled, libLinkOnly);buildInfo.addIncludePaths (fullfile (pwd,“mkl”,“赢”,“包括”));buildInfo.addDefines (“-DMKL_ILP64”);结束函数headerName = getHeaderFilename(“mkl_cblas.h”;结束函数intTypeName = getBLASIntTypeName() intTypeName =“MKL_INT”;结束结束结束
你必须提供getHeaderFilename
,getBLASIntTypeName
,updateBuildInfo
方法。的getHeaderFilename
方法返回CBLAS头文件名。如果您正在使用不同的BLAS库,请进行替换mkl_cblas.h
使用CBLAS头文件的名称。的getBLASIntTypeName
方法返回CBLAS接口使用的整数数据类型的名称。如果您正在使用不同的BLAS库,请进行替换MKL_INT
使用特定于CBLAS接口的整数数据类型的名称。的updateBuildInfo
方法提供构建过程链接到BLAS库所需的信息。使用类似于示例回调类中的代码来指定头文件的位置、BLAS库的完整路径名称以及编译器和链接器选项。如果使用Intel MKL BLAS库,请使用链接线路顾问查看为您的用例推荐哪些库和编译器选项。
中已经实现了其他三个方法编码器。布拉斯特区Callback
.这些方法是getBLASDoubleComplexTypeName
,getBLASSingleComplexTypeName
,useEnumNameRatherThanTypedef
.默认情况下,您的回调类继承这些实现编码器。布拉斯特区Callback
.在某些情况下,当定义回调类时,必须用自己的定义重写这些方法。
的getBLASDoubleComplexTypeName
方法返回所生成代码中用于双精度复杂变量的类型。如果BLAS库采用的类型不是双*
而且void *
对于双精度复杂数组参数,请在回调类定义中包含此方法。
函数doubleComplexTypeName = getBLASDoubleComplexTypeName() doubleComplexTypeName =“my_double_complex_type”;结束
取代my_double_complex_type
BLAS库为双精度复杂数组参数所采用的类型。
的getBLASSingleComplexTypeName
方法返回所生成代码中用于单精度复杂变量的类型。如果BLAS库采用的类型不是浮*
而且void *
对于单精度复杂数组参数,请在回调类定义中包含此方法。
函数singleComplexTypeName = getBLASSingleComplexTypeName() doubleComplexTypeName =“my_single_complex_type”;结束
取代my_single_complex_type
BLAS库为单精度复杂数组参数所采用的类型。
的useEnumNameRatherThanTypedef
方法返回假
默认情况下。如果BLAS库中的枚举类型包括枚举
关键字,重新定义此方法以返回真正的
在回调类定义中。
函数p = useEnumNameRatherThanTypedef() p = true;结束
的生成的C源代码的摘录枚举
关键字:
enum CBLAS_SIDE;enum cblas_upo b_t;双温度;enum CBLAS_TRANSPOSE c_t;enum CBLAS_DIAG d_t;
通过指定BLAS回调类生成BLAS调用
这个例子展示了如何生成调用特定BLAS库中的BLAS函数的代码。BLAS回调类useMyBLAS
指定要在本例中使用的BLAS库。
创建一个Simul金宝appink®模型。
添加一个MATLAB函数块到模型。
在MATLAB函数块中,添加调用基本矩阵操作的函数的代码。例如,添加函数
myMultiply
两个矩阵相乘一个
而且B
.函数C = myMultiply(A,B)% # codegenC = a * b;结束
添加两个常数左边的街区MATLAB函数块。将它们的值设置为
0 (1000)
.添加一个外港块的右边MATLAB函数块。
把积木连接起来。
2 .在“配置参数”对话框中设置自定义BLAS库回调到回调类的名称
useMyBLAS
.回调类必须在MATLAB中®路径。
构建模型。
如果
一个
而且B
,代码生成器会对矩阵乘法函数产生BLAS调用。
在执行环境中定位BLAS库
BLAS库必须在您的执行环境中可用。如果您的BLAS库是共享的,请使用环境变量或链接器选项指定BLAS库的位置。
在Windows操作系统下,修改环境变量PATH。
Linux操作系统®平台,修改LD_LIBRARY_PATH环境变量或使用
rpath
链接器选项。在一个macOS平台,修改DYLD_LIBRARY_PATH环境变量或使用
rpath
链接器选项。
要指定rpath
链接器选项,使用构建信息addLinkFlags
方法中的updateBuildInfo
方法的BLAS回调类。例如,对于GCC编译器:
buildInfo.addLinkFlags (sprintf (' - wl rpath、“% s”,libPath));
OpenBLAS库的使用说明和限制
类的调用是否包含在生成的代码中OpenBLAS图书馆功能,遵循以下准则和限制:
如果生成的c++代码包含对OpenBLAS库函数的调用,请使用
学究式的
选项产生警告。禁用学究式的
选项,将这些行包含在updateBuildInfo
方法:如果ctx.getTargetLang () = =“c++”buildInfo.addCompileFlags (“-Wno-pedantic”);结束
OpenBLAS不支持C89/C90金宝app标准。
另请参阅
相关的话题
外部网站
- https://www.netlib.org/blas/
- https://www.netlib.org/blas/faq.html#_5_a_id_are_optimized_blas_libraries_available_where_can_i_find_vendor_supplied_blas_a_are_optimized_blas_libraries_available_where_can_i_find_optimized_blas_libraries
- https://software.intel.com/content/www/us/en/develop/documentation/onemkl-developer-reference-c/top.html
- https://software.intel.com/content/www/us/en/develop/tools/oneapi/components/onemkl/link-line-advisor.html