主要内容

支持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 (1,32);结束s =长度(Z);

在下面的例子中,如果的值n在编译时未知,则Z是无限的。

函数s = myfcn(n) Z = rand(1,n);s = sum(Z);结束

你可以通过以下方法定义可变大小的数组:

  • 使用构造函数,例如0,其大小值为非常量

  • 在使用同一个变量之前,为它分配多个常量大小

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

  • 使用将变量的所有实例声明为变量大小coder.typeofcoder.varsize功能。例如,coder.typeof(1, [12,1],[true, false])而且coder.varsize(1, [Inf,1], [true, false])

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

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

代码生成行为

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

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

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

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

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

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

属性可以判断数组是固定大小还是可变大小大小的列变量标签中的代码生成报告。

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

代码生成的结构定义

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

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

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

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

  • 将结构传递给局部函数

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

请注意

GPU编码器生成更有效的代码时,你使用数组的结构而不是数组的结构。

例子

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

tempS = struct(“一个”0,“b”, 0);num = 2000;AofS = repmat(tempS,numE,1);

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

ind = 1:num AofS(ind)。A =兰特;AofS(印第安纳州)。B = rand;结束

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

函数[V] = mStructSupport(AofS) V = arrayOp(AofS);结束函数AofS = arrayOp(AofS) n = nummel (AofS);i = 1:n AofS(i)。a = AofS(i)。B * 2;结束结束

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

不支持的功能

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

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

  • 数组边界和维度检查。

  • 打破语句。

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

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

  • MATLAB类。

Baidu
map