主要内容

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

MATLAB的GPU编万博1manbetx码器™支持许多®支持的语言特性万博1manbetxMATLAB编码器™,请参阅MATLAB语言特性支持C / c++代码生成万博1manbetx。然而,一些功能可能支持限制模式和其他人不支持。万博1manbetx在下面几节中,我们将重点介绍一些重要的特性,影响GPU代码生成,然后列表不支持的GPU编码器的功能。万博1manbetx

一个常见的和重要的考虑是适应矩阵的支持。万博1manbetx这个特性都会影响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 =兰德(1,n);s =总和(Z);结束

您可以定义适应可变数组:

  • 使用构造函数,例如0,一个非常数的大小值

  • 分配多个常数大小相同的变量在使用前

  • 使用循环变量的维度

  • 声明一个变量的所有实例被使用适应coder.typeofcoder.varsize功能。例如,coder.typeof(1, [12,1],[true, false])coder.varsize(1, [Inf,1], [true, false])

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

启用和禁用支持适应可变数组万博1manbetx

代码生成的行为

为适应可变数组有界,GPU编码器将这些有界变量映射到GPU创建和CUDA内核。为适应可变数组,指定上界为适应可变数组指定上界

无界,适应可变数组和适应可变数组的大小是大于或等于一个DynamicMemoryAllocationThreshold,GPU编码器不将这些变量映射到GPU和内核创建。代码生成器在CPU上动态地分配内存堆。GPU编码器发出警告的变量构建日志和代码生成报告。

默认情况下,代码生成器将使用动态内存分配的适应可变数组大小是大于或等于阈值的阈值2 GB。改变这些设置:

  • 在配置对象,设置EnableDynamicMemoryAllocation真正的DynamicMemoryAllocationThreshold一个非负整数。

  • 在GPU编码器的应用内存设置中,选择启用动态内存分配并设置动态内存分配的阈值一个非负整数。

适应可变数组代码生成报告

你可以告诉是否固定大小的数组或适应通过查看大小列的变量标签在一个代码生成报告。

一个冒号(:)表明一个维度是适应的。一个问号(?)表明,大小是无界的。例如,一个大小为1×-:?表明,第一个维度是固定大小的大小1和大小的第二个维度是无界的,适应。星号(*)表示代码生成器产生了适应可变数组,但是在执行过程中不改变数组的大小。

结构定义代码生成

生成有效的独立的代码结构,您必须定义和使用结构不同的比你通常在MATLAB环境中运行时代码。对于代码生成,您必须首先创建一个标量模板版本的结构之前增长到一个数组中。代码生成推理引擎使用这个标量值的类型的基本类型数组。为MATLAB生成独立的代码结构,你是限于以下操作:

  • 结构定义为本地和持久变量通过分配和使用结构体函数

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

  • 定义主键或入口点函数的输入结构

  • 通过结构本地函数

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

请注意

GPU编码器生成更高效的代码当你使用结构体数组而不是结构体的数组。

例子

这个例子展示了如何编写一个MATLAB函数使用结构数组,以便适用于代码生成。首先,您必须指定使用的基本元素结构体函数。

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

在MATLAB中,当建立一个结构数组,您通常添加字段。这种“动态”风格的建筑结构不支持代码生成。万博1manbetx原因之一是,它是可能的在MATLAB为两个不同的领域有不同的结构元素的一个结构数组,冲突的类型推断的静态方法。因此,您必须首先指定基本标量元素,然后从这充分成长一个结构数组元素指定。这种方法可以保证结构的两个元素数组总是分享类型(字段)。

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

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

函数[V] = mStruct万博1manbetxSupport (AofS) V = arrayOp (AofS);结束函数AofS = arrayOp (AofS) n =元素个数(AofS);i = 1: n AofS(我)。一个= AofS(我)。b * 2;结束结束

您可以使用任何方法中描述通过使用GPU编码器应用代码生成对于这个例子生成CUDA代码。

不支万博1manbetx持的功能

下面的列表包含了目前不支持的功能。万博1manbetx

  • 内存完整性检查,看到控制运行时检查

  • 数组绑定和尺寸检查。

  • 打破语句。

  • 支持函数处理只有在另一个函数内定义,而不是万博1manbetx作为入口点参数。

  • 支持匿名函数只有当另一个函数内定义的,而不是作为万博1manbetx入口点参数。

  • MATLAB类。