主要内容

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

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

一个常见且重要的考虑因素是可变大小的矩阵支持。这个特性可以真正影响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])

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

启用和禁用对可变大小数组的支持

代码生成的行为

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

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

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

  • 在配置对象中设置DynamicMemoryAllocation阈值而且DynamicMemoryAllocationThreshold到一个非负整数。

  • 在GPU Coder应用中,在内存设置,设置动态内存分配对于最大大小达到或超过阈值的数组动态内存分配阈值到一个非负整数。

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

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

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

代码生成的结构定义

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

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

  • 使用点符号的索引结构字段

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

  • 将结构传递给局部函数

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

请注意

当你使用结构的数组而不是结构的数组时,GPU Coder生成更高效的代码。

例子

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

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

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

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

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

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

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

不支持的功能

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

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

  • 数组绑定和维度检查。

  • 打破语句。

  • 只有在另一个函数中定义而不是作为入口点参数时,才支持函数句柄。

  • 只有在另一个函数中定义而不是作为入口点参数时,才支持匿名函数。

  • MATLAB类。

Baidu
map