主要内容

支持GPU编码器的MATLAB语言特性金宝app

GPU编码器™支持许多金宝appMATLAB®支持的语言特性金宝appMATLAB编码器™,请参阅支持C/ c++代码生成的MATLAB语言特性金宝app.但是,有些特性可能在受限制的模式下受支持,而有些特性则不受支金宝app持。在下面的章节中,我们将重点介绍一些影响GPU代码生成的重要特性,然后列出GPU编码器不支持的特性。金宝app

一个常见且重要的考虑是支持可变大小的矩阵。金宝app这个特性真的会影响CUDA的方式®下面的讨论描述了GPU代码生成的特性和注意事项。

可变大小数组的代码生成

对于代码生成,数组维是固定大小适应.如果代码生成器可以确定数组的大小,并且数组的大小在运行时不改变,则维度是固定大小的。当数组的所有维度都是固定大小时,该数组为固定大小数组中。在下面的例子中,Z是一个固定大小的数组。

函数Z = myfcn() Z = 0 (1,4);结束

如果代码生成器不能确定数组的大小,或者代码生成器确定数组的大小发生了变化,则维度为可变大小。如果数组中至少有一个维是可变大小的,则该数组为适应数组中。

可变尺寸的维度是有界的无限.有界维度的上限是固定的。无界尺寸没有固定的上限。

在下面的例子中,第二个维度Z是有界的,适应。它的上界是32。

函数s = myfcn (n)如果(n > 0) Z = 0 (1,4);其他的Z = 0 (32);结束s =长度(Z);

在下面的示例中,如果n在编译时是未知的,那么Z是无限的。

函数s = myfcn(n) Z = rand(1,n);s =总和(Z);结束

你可以通过以下方式定义可变大小数组:

  • 使用构造函数,例如0,大小为非常量

  • 在使用同一个变量之前,为其指定多个常量大小

  • 使用循环来增加变量的维数

  • 使用。声明变量的所有实例为变量大小coder.typeofcoder.varsize功能。例如,coder.typeof(1, [12,1],[true, false])coder.varsize(1, [Inf,1], [true, false])

有关更多信息,请参见为代码生成定义可变大小的数据

启用和禁用可变大小阵列支持金宝app

代码生成的行为

对于有界的可变大小数组,GPU编码器将这些有界变量映射到GPU和CUDA内核。要指定可变大小数组的上界,请参见指定可变大小数组的上界

对于大小大于或等于a的无界可变大小数组和可变大小数组DynamicMemoryAllocation阈值,GPU编码器不会将这些变量映射到GPU,内核也不会创建。代码生成器在CPU堆上动态分配内存。GPU编码器在构建日志和代码生成报告中对无界变量发出警告。

默认情况下,代码生成器被设置为为大小大于或等于阈值(阈值为2 GB)的可变大小数组使用动态内存分配。更改以下设置:

  • 在配置对象中,设置DynamicMemoryAllocation阈值DynamicMemoryAllocationThreshold变成一个非负整数。

  • 在GPU编码器应用中,在内存设置,设置动态内存分配对于最大大小大于或等于阈值的数组动态内存分配阈值变成一个非负整数。

代码生成报告中的可变大小数组

属性可以判断一个数组是固定大小的还是可变大小的大小列的变量选项卡在代码生成报告中。

冒号(:)表示维度是可变大小的。问号(?)表示大小是无界的。例如,大小为1 by-:?指示第一个维度的大小为固定大小1,第二个维度的大小为无界的可变大小。星号(*)表示代码生成器生成了一个可变大小的数组,但数组的大小在执行期间不改变。

代码生成的结构定义

要为结构生成有效的独立代码,您必须以不同于通常在MATLAB环境中运行代码时的方式定义和使用结构。对于代码生成,您必须首先创建结构的标量模板版本,然后再将其增长为数组。代码生成推理引擎使用此标量值的类型作为数组的基本类型。要为MATLAB结构生成独立的代码,您只能进行以下操作:

  • 的方法将结构定义为局部和持久变量结构体函数

  • 使用点表示法的索引结构字段

  • 将主函数或入口点函数输入定义为结构

  • 将结构传递给局部函数

有关更多信息,请参见代码生成的结构定义

请注意

当你使用阵列的结构而不是阵列的结构时,GPU编码器生成更高效的代码。

例子

这个例子展示了如何编写一个MATLAB函数,使用结构数组,使其适合于代码生成。方法指定基本元素结构体函数。

临时工=结构(“一个”0,“b”, 0);numE = 2000;AofS = repmat(临时工numE 1);

在MATLAB中,当构建结构数组时,通常会添加字段。代码生成不支持这种“动态”构建结构风格。金宝app一个原因是,在MATLAB中,结构数组的两个不同元素可能有不同的结构字段,这与类型推断的静态方法相冲突。因此,必须首先指定基本标量元素,然后从完全指定的元素增长结构数组。此方法保证结构数组的两个元素始终共享type(字段)。

= 1: number AofS(ind)。一个=兰德;AofS(印第安纳州)。b =兰德;结束

现在,您可以定义一个入口点函数mStruct金宝appSupport这需要AofS作为输入。当地的函数arrayOp双打AofS.b并将结果存储在AofS.a

函数[V] = mStruct金宝appSupport(AofS) V = arrayOp(AofS);结束函数AofS = arrayOp(AofS) n = numel(AofS);i = 1:n AofS(i)一个= AofS(我)。b * 2;结束结束

您可以使用中描述的任何方法使用GPU编码器应用程序生成代码为本例生成CUDA代码。

不支金宝app持的功能

下面的列表包含当前不支持的特性。金宝app

  • 内存完整性检查,参见控制运行时检查

  • 数组绑定和尺寸检查。

  • 打破语句。

  • 仅当在另一个函数中定义函数句柄而不是作为入金宝app口点参数时,才支持函数句柄。

  • 匿名函数只支持在另一个函数中定义而不是作为入口点金宝app参数。

  • MATLAB类。