主要内容

中变量的分类PARFOR-循环

概述

MATLAB®编码器™内部的变量进行分类PARFOR-loop到下表中的类别之一。它不支持的变量,它不能归金宝app类。如果一个PARFOR-loop包含无法被唯一分类或某个变量违反其类别限制变量中,PARFOR-loop产生一个错误。

分类 描述
用作数组的循环索引
切片 其区段由循环的不同迭代上被操作的阵列
播送 一个变量,其值用于在循环内循环之前定义的,但是在循环内未分配
减少 在循环的迭代中累积值,而不考虑迭代顺序
短暂的 一种可变的循环内产生,但不像切片或减少的变量,不提供外部的环

每个这些变量分类的出现在下面的代码段:

一个= 0;C = PI;Z = 0;R =兰特(1,10);PARFOR I = 1:10 A = I;% 'a' 是一个临时变量z = Z + I;% 'Z' 是一个减少的变量b(ⅰ)= R(I);%“b”为切片的输出变量;% 'R' 切片输入变量,如果我<= C% 'C' 是广播可变d = 2 * A;%“d”为一个临时变量端端

切片变量

一种切片变量是其值可以被分解成段,或中,然后通过不同的线程操作的分开。循环的每一次迭代工作在不同切片的数组。

在下一个示例中,将显示一种由该阵列的单个元件的:

PARFOR I = 1:长度(A)B(1)= F(A(i))的;结尾

切片变量的特性

在一个变量PARFOR-loop切片,如果它具有以下特点:

  • 第一级索引类型-第一级索引为括号,()

  • 固定索引列表-在第一级括号内,给定变量的所有引用的索引列表相同。

  • 索引形式 - 在指数的变量列表中,只有一个指标涉及到循环变量。

  • 阵列的形状 - 在分配给一个切片变量,分配的右手边是不[]或者''(这些运算符表示删除元素)。

第一级索引类型。对于切片变量,索引的第一电平被用括号括起来,()。例如,一种(...)。如果您使用点符号引用变量,斧头,变量未被切片。

多变的一种左边不是切片的;变量一种右侧切片:

A.q(I,12)A(I,12).Q

固定索引列表. 在切片变量索引的第一级括号内,给定变量的所有引用的索引列表都是相同的。

多变的B.左边是不切片的,因为B.索引由一世i+1在不同的地方。多变的B.右侧切片。

parfori=1:10b(i)=B(i+1)+1;终止
parfori=1:10b(i+1)=B(i+1)+1;终止

索引的形式。在指数切片变量列表中,一个索引的形式是一世i+k我知道k+i, 或者k-i

  • 一世是循环变量。

  • K.是一个常数或一个简单的(非索引)变量。

  • 每隔一个指数是一个常数,一个简单的变量,结肠,或结尾

在使用其他变量和循环变量对数组进行索引时,不能在循环内设置这些变量。这些变量在整个过程的执行过程中保持不变PARFOR陈述。你不能用自己的循环变量结合起来,形成一个索引表达式。

在以下实施例,一世是循环变量,jK.非索引是变量。

变量不是切片 变量切片
A(I + F(k)的,J,:,3)A(I,20:30,端)A(I,:,s.field1)
A(I + K,J,:,3)A(I,:,端)A(I,:,k)的

阵列的形状。切片的变量必须保持恒定的形状。在以下实施例中,可变一种未被切片:

A(i,:)=[];A(结束+1)=i;

广播变量

一种广播变量比循环变量或没有被循环内改性切片的变量以外的其他变量。

还原变量

一种减少变量积累依赖于所有的迭代在一起,但独立于迭代顺序的值。

这个例子显示了一个PARFOR-使用标量缩减赋值的循环。它使用还原变量X积累跨越总和10.循环迭代。迭代的线程的执行顺序并不重要。

x=0;parfori=1:10x=x+i;x端

在哪里EXPR是一个MATLAB表达式,赋值语句的两边都会出现缩减变量。

X=X+expr X=expr+X
X = X - EXPR 减少分配,关联性,减灾功能的交换性
X=X.*expr X=expr.*X
X = X * EXPR X = EXPR * X
X=X&expr X=expr&X
X = X |EXPR X=expr | X
X =分钟(X,表达式) X=最小值(expr,X)
X = MAX(X,表达式) X=最大值(expr,X)
X=f(X,expr)
功能F必须是一个用户定义的功能。
X = F(表达式,X)
减少分配,关联性,减灾功能的交换性

允许的语句中的每一个被称为减少分配。的减少变量只能在这种类型的分配出现。

下面的示例示出了减少变量的典型用法X

X = ...;%做X的一些初始化PARFOR I = 1:N X = X + d(I);结尾

此循环相当于以下内容,其中d(I)由不同的迭代中计算:

X = X + d(1)+ ... + d(n)的

如果循环是有规律为了-loop,可变X在每次迭代中,将在进入循环之前或从循环的上一次迭代中获取其值。但是,这一概念不适用于PARFOR- 砍伐。

在一个PARFOR-loop,的值X不直接每个线程内更新。相反,增加的d(I)在每个线程中使用一世测距过的所述子集1:n该线程执行。然后,该软件结果累加到X

同样,减少:

R = R  X(ⅰ)
相当于:
R = R  X(1)]  X(2)...  X(N)
操作首先施加到X(1)... X(n)的,则部分结果被施加到R.

If操作如果需要两个输入,则应满足以下标准之一:

  • 以两个论点为例typeof运算(X(i))的和返回typeof运算(X(i))的

  • 取一个参数的typeof(r)的和一个typeof运算(X(i))的和返回的typeof(r)的

简化变量的规则

使用相同的还原功能或操作中的所有作业减少。为了减少变量,你必须使用相同的还原功能或操作中的所有作业减少该变量。在下面的例子中,PARFOR-loop左边是无效的,因为减少分配用途+在一个例子中,以及*另一方面。

还原变量的使用无效 还原变量的有效使用
如果A>5*ka=A+1,则i=1:n;否则A=A*2;终止
如果A>5*ka=A*3,则i=1:n;否则A=A*2;终止

在降噪功能参数和返回类型的限制。的减少R = R X(ⅰ)应采取的参数typeof运算(X(i))的和返回typeof运算(X(i))的或者以的typeof(r)的typeof运算(X(i))的和返回的typeof(r)的

在以下示例中,在不正确的环路,R.是一个定点类型和2事实并非如此。要解决此问题,请强制转换2是相同的类型R.

还原变量的使用无效 还原变量的有效使用
函数R = fiops(在)R =连接(在 '字长',20,... 'FractionLength',14,... 'SumMode', 'SpecifyPrecision',... 'SumWordLength',20,..'SumFractionLength',14,... 'ProductMode', 'SpecifyPrecision',... 'ProductWordLength',20,... 'ProductFractionLength',14);PARFOR I = 1:10 R = R * 2;结尾
R =科幻(在 '字长',20,... 'FractionLength',14,... 'SumMode', 'SpecifyPrecision',... 'SumWordLength',20,... 'SumFractionLength',14,... 'ProductMode', 'SpecifyPrecision',... 'ProductWordLength',20,... 'ProductFractionLength',14);T = r.numerictype;F = r.fimath;PARFOR I = 1:10 R = R *音响(2,T,F);结尾

在下面的例子中,衰减函数fcn是无效的,因为它没有当输入处理的情况下是固定的点。(这+*操作自动多态)。你必须写的多态版本fcn以处理预期的输入类型。

还原变量的使用无效 还原变量的有效使用
函数[Y0,Y1,Y2] = pfuserfcn(U)Y0 = 0;Y1 = 1;[F,N] = fiprops();Y2 =科幻(1,N,F);PARFOR(I = 1:numel(U),12)Y0 = Y0 + U(I);Y1 = Y1 * U(I);Y2 = FCN(Y2,U(I));端结束函数y = FCN(U,V)Y = U * V;结尾
函数[Y0,Y1,Y2] = pfuserfcn(U)Y0 = 0;Y1 = 1;[F,N] = fiprops();Y2 =科幻(1,N,F);PARFOR(I = 1:numel(U),12)Y0 = Y0 + U(I);Y1 = Y1 * U(I);Y2 = FCN(Y2,U(I));端端%FCN型双%和FI函数y的手柄输入= FCN(U,V)如ISA(U, '双重')Y = U * V;别的[F,N] = fiprops();Y = U *音响(V,N,F); end end function [F, N] = fiprops() N = numerictype(1,96,30); F = fimath('ProductMode',... 'SpecifyPrecision',... 'ProductWordLength',96); end

减少分配,关联性,减灾功能的交换性

减少作业MATLAB编码器不允许减少变量是在任何地方读PARFOR-loop除了减少语句。在下面的例子中,调用FOO(r)的还原后声明R = R + I导致循环无效。

函数r = TEMP%#代码生成R = 0;PARFOR I = 1:10 R = R + I;FOO(R);年底结束

关联性在减少作业。如果使用用户定义函数F在减少变量的定义,得到的确定性行为PARFOR-循环,还原函数F必须是关联的。

笔记

如果F没有关联性,MATLAB编码器不产生错误。您必须编写符合这一建议代码。

要关联,功能F必须满足以下所有一种B., 和C

F(A,F(B,C))= F(F(A,B),C)

交换性在减少作业。一些联想功能,包括+, 和最大限度,也可交换。也就是说,他们满足以下所有一种B.

f(a,b)=f(b,a)

功能F减少分配的,必须是可交换的。如果F是不可交换的,可能会导致不同的答案,循环的不同执行。

除非F是一个已知的非交换内置函数,软件假定它是交换的。

临时变量

一种临时变量是一个变量,它是一个直接的,非索引赋值的目标,但不是减少变量。在下面的PARFOR-循环,一种D.是临时变量:

一个= 0;Z = 0;R =兰特(1,10);PARFOR I = 1:10 = I;%变量A是暂时的Z = Z + I;如果我<= 5 d = 2 * A;%变量d是暂时结束端

与此相反的行为为了-loop,一个的每次迭代之前PARFOR-循环,MATLAB编码器有效清除临时变量。因为迭代必须是独立的,临时变量的值不能从环到另一个的一次迭代通过。因此,临时变量必须在身体内部设置PARFOR-loop,使得它们的值对于每次迭代分别定义的。

上下文中的临时变量PARFOR语句是从存在的循环之外的同名变量不同。

未初始化临时表

因为在每次迭代开始时都会清除临时变量,MATLAB编码器可以检测在其中通过循环迭代使用临时变量之前它在该次迭代设置某些情况下。在这种情况下,MATLAB编码器发出一个静态错误而不是运行时错误,因为如果将发生运行时错误,则允许继续执行没有什么意义。例如,假设您编写:

b=正确;parfori=1:n如果b&某些条件(i)做某事(i);b=假;终止终止

此循环作为普通循环是可以接受的为了-loop,但作为PARFOR-循环,B.是一个临时变量,因为它直接作为循环内赋值的目标出现。因此,它在每次迭代开始时被清除,因此在如果被初始化。(如果你改变PARFOR为了, 的价值B.假定循环的顺序执行,以使得do_something(ⅰ)中只用于较低值时执行一世直到B.是一定的错误的。)