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编码器)。
对于有界的可变大小数组,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
内存完整性检查,请参阅控制运行时检查(MATLAB编码器)。
数组绑定和尺寸检查。
打破
声明。
仅当在另一个函数中定义函数句柄而不是作为入万博1manbetx口点参数时,才支持函数句柄。
仅当在另一个函数中定义而不是作为入口点参数时,才万博1manbetx支持匿名函数。
MATLAB类。