主要内容

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

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

一个常见且重要的考虑因素是可变大小矩阵支持。此功能确实会影响CUDA的方式万博1manbetx®内核被创建,下面的讨论描述了GPU代码生成的特性和注意事项。

可变大小数组的代码生成

对于代码生成,需要一个数组维度固定尺寸可变尺寸. 如果代码生成器可以确定数组的大小,并且数组的大小在运行时没有更改,那么维度的大小是固定的。当数组的所有维度都是固定大小时,该数组是一个固定尺寸数组。在下面的示例中,Z是一个固定大小的数组。

作用Z=myfcn()Z=0(1,4);终止

如果代码生成器无法确定数组的大小,或者代码生成器确定大小已更改,则维度的大小是可变的。当至少有一个维度是可变大小时,数组就是一个可变尺寸大堆

可变尺寸标注可以是有界无限的.有界尺寸具有固定的上限尺寸。无界尺寸没有固定的上限尺寸。

在下面的示例中,的第二个维度Z是有界的,大小可变。它的上限为32。

作用s=myfcn(n)如果(n>0)Z=0(1,4);其他的Z=零(1,32);终止s=长度(Z);

在以下示例中,如果N在编译时未知,则Z是无限的。

作用s=myfcn(n)Z=rand(1,n);s=总和(Z);终止

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

  • 使用构造函数,例如一个,具有非恒定的大小值

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

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

  • 通过使用将变量的所有实例声明为变量大小编码员变码器功能。例如,编码者类型(1,[12,1],[true,false])coder.varsize(1[Inf,1],[true,false]).

有关详细信息,请参阅定义用于代码生成的可变大小数据.

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

代码生成行为

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

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

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

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

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

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

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

冒号(:)表示维度大小可变。问号(?)表示大小没有限制。例如,大小为1×-:?指示第一个维度的大小为固定大小1,第二个维度的大小为无界、可变大小。星号(*)表示代码生成器生成了一个可变大小的数组,但数组的大小在执行过程中不会改变。

代码生成的结构定义

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

  • 通过赋值和使用结构作用

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

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

  • 将结构传递给局部函数

有关详细信息,请参阅代码生成的结构定义.

笔记

当您使用数组结构而不是结构数组时,GPU编码器会生成更高效的代码。

实例

这个例子展示了如何编写一个使用结构数组的MATLAB函数,以便它适合于代码生成。首先,必须使用结构作用

tempS=struct(“a”,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作为输入。局部函数排列双打AofS.b并将结果存储在AofS.a.

作用[五] =mStructS万博1manbetxupport(AofS)V=阵列(AofS);终止作用AofS=arrayOp(AofS)n=numel(AofS);对于i=1:nAOFS(i).a=AofS(i).b*2;终止终止

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

不支万博1manbetx持的功能

以下列表包含当前不受支持的功能。万博1manbetx

  • 内存完整性检查,请参阅控制运行时检查.

  • 数组绑定和维度检查。

  • 打破声明。

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

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

  • MATLAB类。