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])
.
有关详细信息,请参阅定义用于代码生成的可变大小数据.
对于有界的可变大小数组,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支持匿名函数。
MATLAB类。