主要内容

矩阵乘法运算ANSI./ISOC Blas代码替换

您可以使用乘法函数开发用于浮点矩阵/矩阵/矩阵和矩阵/矢量乘法操作的代码替换库SGEMM在MathWorks C Blas库中定义。使用第三方C BLAS库进行更换,更改此示例中的构建要求以指向您的库。要开发代码替换库,请使用交互式或编程方法。有关更多信息,请参见开发一个代码替换库

交互式开发代码替换库

  1. 打开代码替换工具(crtool),从MATLAB命令行使用以下命令:

    >> Crtool.
  2. 创建一个表。

    1. 从CRTool上下文菜单中,选择文件>新表

    2. 在右侧窗格中,为表命名crl_table_cblas..点击应用

  3. 创建一个条目。从CRTool上下文菜单中,选择文件>新条目>CBLAS操作(ATLAS)

  4. 创建输入参数。在功能下拉列表中,选择

  5. 创建概念表示。概念表示描述要替换的函数的签名。在概念功能CRTool的小节,指定返回参数,日元,以及输入参数,u1u2与之数据类型单身和参数类型矩阵。

  6. 创建实现表示。实现表示描述了优化函数的签名。对于本例,要指定实现参数具有与概念参数相同的顺序和属性,请选择使概念和实现参数类型相同复选框。设定布拉斯特区水平3(向量)

    指定A.的名字为下替换函数功能原型

  7. 指定构建信息。点击构建信息选项卡打开“构建要求”窗格。指定代码更换代码所需的文件(源,标题,对象)。对于此示例,您无需指定构建信息。

  8. 验证并保存表。在映射信息选项卡上,单击验证条目.在crtool上下文菜单中,选择文件>保存表>节省

  9. 注册代码替换库。注册创建由您指定的表组成的库。选择文件>生成注册文件.在“生成注册文件”对话框中,填写这些字段:

    要使用代码替换库,请使用命令刷新当前的MATLAB会话:

    >> sl_refresh_customizations.

  10. 验证代码替换库。从MATLAB命令行,通过使用使用的图书馆代码替换查看器并验证表和项是否正确指定。有关更多信息,请参见验证代码替换库.配置模型以使用代码替换库,生成代码,并验证替换是否按预期发生。如果出现意外的行为,请检查命中和错误日志以解决问题。

以编程方式开发代码替换库

  1. 控件中打开编程接口马铃薯菜单通过选择新的>功能

  2. 创建一个表。

    1. 创建一个调用代码替换库表的函数。该函数不应该具有参数并返回表对象。

    2. 通过调用创建表对象环球套票。TflTable

    功能htable = crl_table_cblas.%创建一个函数来调用代码替换库表%%创建表对象htable = rtw.tfltable;
  3. 创建一个条目。因为本例替换了一个函数,所以通过调用entry函数在表中创建一个代码替换项RTW.TFLCBLASENTRYGENERATOR.

    功能htable = crl_table_cblas.%创建代码替换库表%%创建表对象htable = rtw.tfltable;%%创建条目%%%%%%%%%%%% 定义库路径Cblas库文件 %%%%%%%%%%%%%%%%%%LibPath = fullfile ('<指定您的cblas库>的路径');如果ispc libExt =“自由”elseifISMAC Libext =.'迪拉布'别的libExt ='所以'结束%为dgemm32创建表项hentry = rtw.tflcblasentrygenerator;
  4. 创建输入参数。因为此示例替换了函数,请通过调用函数创建条目参数settflcfunclectentryparameters.

    功能htable = crl_table_cblas.%创建代码替换库表%%创建表对象htable = rtw.tfltable;%%创建条目%%%%%%%%%%%% 定义库路径Cblas库文件 %%%%%%%%%%%%%%%%%%LibPath = fullfile ('<指定您的cblas库>的路径');如果ispc libExt =“自由”elseifISMAC Libext =.'迪拉布'别的libExt ='所以'结束%为dgemm32创建表项hentry = rtw.tflcblasentrygenerator;%%创建条目参数hEntry.setTflCOperationEntryParameters (...“关键”“RTW_OP_MUL”...'优先事项',100,...“ImplementationName”“cblas_sgemm”...'实现源文件''ccblas.c'...“ImplementationHeaderFile”'ccblas.h'...“AdditionalIncludePaths”,{libpath},...“AdditionalLinkObjs”,{['libcblas'libext]},...'afferallinkflags',{“-lgfortran”},...'副作用',真正的);
  5. 创建概念表示。概念表示描述要替换的函数的签名。要显式指定参数属性,请调用该函数createAndAddConceptualArg.要在函数调用中指定矩阵参数,请使用参数类RTW.TFLARGMATRIX.并指定实参有效的基类型和维度。这种类型的表项支持格式中指定的范围金宝app[Dim1Min Dim2Min……DimNMin;Dim1Max Dim2Max……DimNMax].例如,[2 2;INF INF]意味着大小2x2或更大的二维矩阵。

    功能htable = crl_table_cblas.%创建代码替换库表%%创建表对象htable = rtw.tfltable;%%创建条目%%%%%%%%%%%% 定义库路径Cblas库文件 %%%%%%%%%%%%%%%%%%LibPath = fullfile ('<指定您的cblas库>的路径');如果ispc libExt =“自由”elseifISMAC Libext =.'迪拉布'别的libExt ='所以'结束%为dgemm32创建表项hentry = rtw.tflcblasentrygenerator;%%创建条目参数hEntry.setTflCOperationEntryParameters (...“关键”“RTW_OP_MUL”...'优先事项',100,...“ImplementationName”“cblas_sgemm”...'实现源文件''ccblas.c'...“ImplementationHeaderFile”'ccblas.h'...“AdditionalIncludePaths”,{libpath},...“AdditionalLinkObjs”,{['libcblas'libext]},...'afferallinkflags',{“-lgfortran”},...'副作用',真正的);%%创建概念表示arg = rtw.tflargmatrix(“日元”'rtw_io_output''单身的');参数。DimRange = [2 2;正正];hEnt.addConceptualArg (arg);arg = rtw.tflargmatrix('U1'“RTW_IO_INPUT”'单身的');arg.dimrange = [2 1;正正];hEnt.addConceptualArg (arg);arg = rtw.tflargmatrix('U2'“RTW_IO_INPUT”'单身的');arg.dimrange = [1 2;正正];hEnt.addConceptualArg (arg);
  6. 创建实现表示。实现表示描述了优化函数的签名。要指定实现参数具有与概念参数相同的顺序和属性,请调用该函数getTflArgFromString.示例代码配置所需的特殊实现参数dgemmdgemv功能替换。便利方法setReturnaddargument.指定参数是返回值还是参数,并将参数添加到条目的实现参数数组中。通过调用函数将完整的条目添加到表中addEntry

    功能htable = crl_table_cblas.%创建代码替换库表%%创建表对象htable = rtw.tfltable;%%创建条目%%%%%%%%%%%% 定义库路径Cblas库文件 %%%%%%%%%%%%%%%%%%LibPath = fullfile ('<指定您的cblas库>的路径');如果ispc libExt =“自由”elseifISMAC Libext =.'迪拉布'别的libExt ='所以'结束%为dgemm32创建表项hentry = rtw.tflcblasentrygenerator;%%创建条目参数hEntry.setTflCOperationEntryParameters (...“关键”“RTW_OP_MUL”...'优先事项',100,...“ImplementationName”“cblas_sgemm”...'实现源文件''ccblas.c'...“ImplementationHeaderFile”'ccblas.h'...“AdditionalIncludePaths”,{libpath},...“AdditionalLinkObjs”,{['libcblas'libext]},...'afferallinkflags',{“-lgfortran”},...'副作用',真正的);%%创建概念表示arg = rtw.tflargmatrix(“日元”'rtw_io_output''单身的');参数。DimRange = [2 2;正正];hEnt.addConceptualArg (arg);arg = rtw.tflargmatrix('U1'“RTW_IO_INPUT”'单身的');arg.dimrange = [2 1;正正];hEnt.addConceptualArg (arg);arg = rtw.tflargmatrix('U2'“RTW_IO_INPUT”'单身的');arg.dimrange = [1 2;正正];hEnt.addConceptualArg (arg);%%创建实现表示%使用RTW.TFLCBlasEntryGenerator for SGEMM需要以下内容%实现签名:const integer ORDER, const integer TRANSA, const integer TRANSB,%const整数m,const整数n,const整数k,const double alpha,% const double* u1, const integer LDA, const double* u2, const integer LDB,%const双beta,双* y1,const整数ldc);当匹配发生时,代码生成器计算M,N,K,LDA,LDB和LDC的%值并将它们插入到%生成的代码。Transa和Transb设置为'n'。%指定替换功能签名arg = hEntry.getTflArgFromString ('y2'“空白”);arg.iotype =.'rtw_io_output';hentry.implentation.setreturn(arg);arg = hEntry.getTflArgFromString ('命令''整数',102.00000000000000000);arg.Type.ReadOnly = true;hEntry.Implementation.addArgument (arg);arg = hEntry.getTflArgFromString ('transa''整数', 111.000000000000000);arg.Type.ReadOnly = true;hEntry.Implementation.addArgument (arg);arg = hEntry.getTflArgFromString (“TRANSB”'整数', 111.000000000000000);arg.Type.ReadOnly = true;hEntry.Implementation.addArgument (arg);arg = hEntry.getTflArgFromString ('M''整数',0.00000000000000000);arg.Type.ReadOnly = true;hEntry.Implementation.addArgument (arg);arg = hEntry.getTflArgFromString (“N”'整数',0.00000000000000000);arg.Type.ReadOnly = true;hEntry.Implementation.addArgument (arg);arg = hEntry.getTflArgFromString ('K''整数',0.00000000000000000);arg.Type.ReadOnly = true;hEntry.Implementation.addArgument (arg);arg = hEntry.getTflArgFromString ('Α''双倍的', 1.000000000000000);arg.Type.ReadOnly = true;hEntry.Implementation.addArgument (arg);arg = hEntry.getTflArgFromString ('U1'“单*”);arg.Type.BaseType.ReadOnly = true;hEntry.Implementation.addArgument (arg);arg = hEntry.getTflArgFromString (“乔治。”'整数',0.00000000000000000);arg.Type.ReadOnly = true;hEntry.Implementation.addArgument (arg);arg = hEntry.getTflArgFromString ('U2'“单*”);arg.Type.BaseType.ReadOnly = true;hEntry.Implementation.addArgument (arg);arg = hEntry.getTflArgFromString (“LDB的”'整数',0.00000000000000000);arg.Type.ReadOnly = true;hEntry.Implementation.addArgument (arg);arg = hEntry.getTflArgFromString (“β”'双倍的',0.00000000000000000);arg.Type.ReadOnly = true;hEntry.Implementation.addArgument (arg);arg = hEntry.getTflArgFromString (“日元”“单*”);arg.iotype =.'rtw_io_output';hEntry.Implementation.addArgument (arg);arg = hEntry.getTflArgFromString (“LDC”'整数',0.00000000000000000);arg.Type.ReadOnly = true;hEntry.Implementation.addArgument (arg);%%将条目添加到表格addEntry (hTable hEntry);
  7. 指定构建信息。在输入参数中,指定代码生成器替换代码所需的文件(头文件、源文件、对象文件)。对于本例,不需要构建信息。

  8. 验证并保存自定义文件。来自马铃薯菜单,通过选择保存此自定义文件文件>节省.从命令行,通过调用它来验证代码替换库表:

    >> HETABLE = CRL_TABLE_CBLA
  9. 注册代码替换库。注册通过定义库名称,代码替换表和其他信息来创建代码替换库。使用以下规范创建注册文件:

    功能RTWTARGETINFO(cm)cm.registrargetInfo(@loc_register_cl);结束功能这个= loc_register_cl这个(1)= rtw.tflregistry;这个(1).name ='用于Mathworks CBlas代码的矩阵乘法的CRL ';这个(1).tablelist = {'crl_table_cblas.m'};在此示例中创建的%表这个(1).targethwdeviceType = {'*'};这个(1).description =“示例代码替换库”结束

    要使用代码替换库,请使用命令刷新当前的MATLAB会话:

    >> sl_refresh_customizations.

  10. 验证代码替换库。从MATLAB命令行,通过使用使用的图书馆代码替换查看器并验证表和项是否正确指定。有关更多信息,请参见验证代码替换库.配置模型以使用代码替换库,生成代码,并验证替换是否按预期发生。如果出现意外的行为,请检查命中和错误日志以解决问题。

相关话题