对GPU编码器的MATLAB语言特性支持万博1manbetx

GPU编码器™ 支持许万博1manbetx多的MATLAB®支持的语言特性万博1manbetxMATLAB编码器™,请参阅C/C++代码生成支持的MATLAB语言功能万博1manbetx(MATLAB Coder)。但是,某些功能可能在受限模式下受支持,而其他功能则不受支持。在万博1manbetx以下部分中,我们将重点介绍影响GPU代码生成的一些重要功能,然后列出GPU Coder不支持的功能。

一个常见且重要的考虑因素是可变大小矩阵支持。此功能确实会影响CUDA的方式万博1manbetx®内核被创建,下面的讨论描述了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.varsize功能。例如,编码者类型(1,[12,1],[true,false])coder.varsize(1, [Inf,1], [true, false])

有关详细信息,请参阅为代码生成定义可变大小的数据(MATLAB编码器)。

启用和禁用可变大小阵列支持万博1manbetx

代码生成行为

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

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

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

  • 在配置对象中,设置动态内存分配门槛DynamicMemoryAllocationThreshold设置为非负整数。

  • 在GPU编码器应用程序中,在内存设置,设置动态内存分配对于最大大小等于或高于阈值的阵列动态内存分配阈值设置为非负整数。

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

通过查看大小列的变量选项卡在代码生成报告中。

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

代码生成的结构定义

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

  • 的方法将结构定义为局部和持久变量结构作用

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

  • 将主要或入口点功能输入定义为结构

  • 将结构传递给局部函数

有关详细信息,请参阅代码生成的结构定义(MATLAB编码器)。

请注意

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

实例

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

tempS=struct(“一个”,0,“b”numE=2000;AofS=repmat(tempS,numE,1);

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

ind=1:numeaofs(ind).a=rand;AofS(ind).b=rand;结束

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

作用[V] = mStruct万博1manbetxSupport(AofS) V = arrayOp(AofS);结束作用AofS=arrayOp(AofS)n=numel(AofS);i = 1:n AofS(i)一个= AofS(我)。b * 2;结束结束

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

不支万博1manbetx持的功能

下面的列表包含当前不支持的特性。万博1manbetx

  • 内存完整性检查,请参阅控制运行时检查(MATLAB编码器)。

  • 数组绑定和尺寸检查。

  • 打破声明。

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

  • 仅当在另一个函数中定义而不是作为入口点参数时,才万博1manbetx支持匿名函数。

  • MATLAB类。