Download presentation
Presentation is loading. Please wait.
1
并行编译简介
2
并行编译简介 并行编译器的组成及任务 数据依赖关系 循环的向量化与并行化 国家高性能计算中心(合肥) 2019/1/2
3
并行编译器的组成及任务 源代码 程序分析 程序优化 并行代码生成 向量机: 组织向量循环 寄存器分配 流水线调度 共享存储多机系统:
数据依赖与控制依赖关系分析 数据流分析 程序分析 程序优化 包括循环向量化与并行化在内的各种优化 并行代码生成 并行语义识别,处理指令级并行调度 向量机: 组织向量循环 寄存器分配 流水线调度 共享存储多机系统: 任务划分 处理机调度 同步 分布存储多机系统: 数据和计算分布 通信 同步 国家高性能计算中心(合肥) 2019/1/2
4
数据依赖关系 Def1: 语句S和T,若存在变量x使之满足下述条件之一,则称语句T依赖于语句S,记为S T,否则S和T之间没有数据依赖关系: (1)流依赖 : S f T,若xOUT(S)且 xIN(T) 且T使用S计算出的x的值;T流依赖于S; (2)反依赖 : S a T,若xIN(S)且 xOUT(T) 但S使用x值先于T对x的定值;T反依赖于S; (3)输出依赖 : S o T,若xOUT(S)且 xOUT(T)但S较之T先对x进行定值; T输出依赖于S; 国家高性能计算中心(合肥) 2019/1/2
5
依赖关系示例 S : A = B + D T : C = A * 3 U : A = A + C V : E = A / 2
e.g. 考虑语句序列: S : A = B + D T : C = A * 3 U : A = A + C V : E = A / 2 IN: B D ,OUT:A IN: A ,OUT:C IN: A C ,OUT:A IN: A ,OUT:E S f T S f U S o U T f U T a U U f V 国家高性能计算中心(合肥) 2019/1/2
6
依赖关系示例 e.g. 循环语句: for i = 1 to 100 do S : A[i] = B[ i+2] + 1;
T : B[i] = A[i-1] – 1; end for a S(1) : A[1] = B[3] + 1 T(1) : B[1] = A[0] – 1 S(2) : A[2] = B[4] + 1 T(2) : B[2] = A[1] – 1 S(3) : A[3] = B[5] + 1 T(3) : B[3] = A[2] – 1 S(100) : A[100] = B[102] + 1 T(100) : B[100] = A[99] – 1 f 依赖关系: S f T S a T 国家高性能计算中心(合肥) 2019/1/2
7
数据依赖关系 Def2:语句S和T在循环L中。如果S的实例S(i)和T的实例T(j)以及变量uS,变量v T,满足:
(1)u和v至少有一个是输出变量; (2)uS(i)和变量v T(j)表示同一个存储单元M (3)在L的顺序执行中,S(i)先于T(j) (4)在L的顺序执行中, S(i)之间T(j)没有其他对M的写操作;则u、v引起T依赖于S,即S T,称为T(j)依赖于S(i), 其中: 流依赖: u OUT(S) , v IN(T) 反依赖: u IN(S) , v OUT(T) 输出依赖:u OUT(S) , v OUT(T) T 对S的依赖即为满足上述条件的偶对(S(i),T(j))的集合。 国家高性能计算中心(合肥) 2019/1/2
8
依赖距离和依赖向量 令α=(α1,α2,…,αn) 和β=(β1,β2,…,βn)是n层循环内的n个整数下标向量,假定α和β存在数据相关性,则依赖距离向量(Dependent Distance Vector)D = (D1,D2,…,Dn)定义为β-α;而依赖方向向量(Dependent Direction Vector)d = (d1,d2,…,dn)定义为: 或 1 或 0 或 -1 国家高性能计算中心(合肥) 2019/1/2
9
例如,有如下的三层循环嵌套: for i = l1 to u1 do for j = l2 to u2 do
for k = l3 to u3 do A(i + 1, j, k – 1) = A(i, j, k) + C endfor 则数组A的三维迭代之间的相关距离向量D = (i + 1 – i, j – j, k – 1 – k ) = (1, 0, -1)和相关方向向量= (<, =, >)。 相关方向向量对计算循环体间相关性十分有用,其相关性是通过相关方向向量不是”=”号的外层循环传递的;相关距离向量指明在同一存储单元的两次访问之间循环迭代的实际距离。它们对开发并行性或优化存储器层次结构时起到指引作用。 国家高性能计算中心(合肥) 2019/1/2
10
语句依赖图和迭代依赖图 语句依赖图-依赖关系的有向图。将语句,如S和T,看成结点,若有S T,则:
间接依赖关系- ,即依赖关系的传递闭包。 若S T,则在语句依赖图中存在S到T的一条路径。 迭代依赖图-即(循环)迭代之间的依赖关系。在循环L中,若语句T依赖于语句S,即S T。令S(I)和T(J)是满足依赖关系的偶对,S(I) T(J),此时应该有I≤J。在I<J时,称迭代H(J)依赖于迭代H(I),记为H(I) H(J)。 S T 国家高性能计算中心(合肥) 2019/1/2
11
语句依赖图示例 有如下循环语句: for i = 4 to 200 do S: A(i) = B(i) + c(i)
T: B(i+2) = A(i-1) + A(i-3) + C(i-1) U: A(i+1) = B(2*i+3) + 1 endfor 各语句间依赖关系如何呢? 国家高性能计算中心(合肥) 2019/1/2
12
语句T流依赖于语句S,即S f T,满足依赖关系的偶对集合为:
{ <S(i), T(j)> | i = j -1 ; 5≤j≤200 } ∪ { <S(i), T(j)> | i = j -3 ; 7≤j≤200 } 语句S流依赖于语句T,即T f S,满足依赖关系的偶对集合为:{ <T(i), S(j)> | i = j -2 ; 6≤j≤200 } 语句S输出依赖于语句U,即 U o S ,满足依赖关系的偶对集合为: { <U(i), S(j)> | i = j -1 ; 5≤j≤200 } 语句T反依赖于语句U,即U a T ,满足依赖关系的偶对集合为:{ <U(i), T(j)> | j = 2*i + 1 ; 4≤i≤99 } 语句T是否流依赖于语句U呢? 国家高性能计算中心(合肥) 2019/1/2
13
语句依赖图示例 for i = 4 to 200 do S: A(i) = B(i) + c(i)
T: B(i+2) = A(i-1) + A(i-3) + C(i-1) U: A(i+1) = B(2*i+3) + 1 endfor S f f o T a U 国家高性能计算中心(合肥) 2019/1/2
14
迭代依赖图示例(1) 有如下二重循环: for i = 0 to 5 do for j = 0 to 4 do
S: A(i+1, j+1) = A(i,j) + B (i,j) endfor 显然,S f S 。满足依赖关系的偶对集合: { <S(i1,i2), S(j1,j2)> | j1 = i1 + 1 , j2 = i2 + 1, 0≤i1≤4, 0≤i2≤3 } // 依赖方向向量和距离向量各是什么? 国家高性能计算中心(合肥) 2019/1/2
15
迭代依赖图(1) 国家高性能计算中心(合肥) 2019/1/2
16
迭代依赖图示例(2) 有如下二重循环: L1 : for i1 = 0 to 4 do L2 : for i2 = 0 to 4 do
S : A(i1+1, i2) = B(i1, i2) + C(i1, i2) T : B(i1, i2+1) = A(i1, i2+1) + 1 U : D(i1, i2) = B(i1, i2+1) – 2 endfor 国家高性能计算中心(合肥) 2019/1/2
17
0≤i1≤3, 1≤i2≤4} ,距离向量为(1,-1),方向向量为(1, -1)。此依赖关系由循环L1携带;
语句T流依赖于语句S,即S f T,满足依赖关系的偶对:{ < S(i1,i2), T(j1,j2) | j1 = i1+1, j2=i2-1, 0≤i1≤3, 1≤i2≤4} ,距离向量为(1,-1),方向向量为(1, -1)。此依赖关系由循环L1携带; 语句S流依赖于语句T,即T f S,满足依赖关系的偶对:{ < T(i1,i2), S(j1,j2) | j1 = i1, j2=i2+1, 0≤i1≤4, 0≤i2≤3} ,距离向量为(0,1),方向向量为(0, 1)。此依赖关系由循环L2携带; 语句U流依赖于语句T,即T f U,满足依赖关系的偶对:{ < T(i1,i2), U(j1,j2) | j1 = i1, j2=i2, 0≤i1≤4, 0≤i2≤4} ,距离向量为(0,0),方向向量为(0,0)。此依赖关系与循环无关。 国家高性能计算中心(合肥) 2019/1/2
18
S T U f 语句依赖图 迭代依赖图 国家高性能计算中心(合肥) 2019/1/2
19
S: A(I, J) = A(I-1, J) + A(I, J-1) endfor
考虑如下循环的迭代依赖图: for I = 1 to 4 do for J = 1 to 4 do S: A(I, J) = A(I-1, J) + A(I, J-1) endfor 国家高性能计算中心(合肥) 2019/1/2
20
依赖关系方程 假定循环中数组下标是循环索引变量的线性表达式
循环的一般表示:(X是n维数组,f和g是循环索引变量I=(I1,I2,…,Im) 的线性函数 ) L1: for I1 = p1 to q1 do L2: for I2 = p2 to q2 do . . . Lm: for Im = pm to qm S : X(f1(I), f2(I), …, fn(I)) = T : = X(g1(I), g2(I), …, gn(I)) endfor 国家高性能计算中心(合肥) 2019/1/2
21
依赖关系方程(丢番图方程) 上述循环L中语句S和T,令u= X(f1(I), f2(I), …, fn(I)) 是S的变量,而v= X(g1(J), g2(J), …, gn(J)) ,u或v至少一个是相应语句的输出变量。若u、v导致S和T之间的依赖关系,则以下方程组 f1(I) - g1(J) = 0 f2(I) - g2(J) = 0 . . . fn(I) - gn(J) = 0 有满足下述约束条件的整数解(i, j),i=(i1,i2,…,im) , j=(j1,j2,…,jm) : pr≤ir≤qr pr≤jr≤qr ;且该解满足下述特定情况下的附加条件: (1) 若S < T 且 S T 则 i≤j (2)若S = T 且 S S 则 i < j (3)若S < T 且 T S 则 i > j 国家高性能计算中心(合肥) 2019/1/2
22
如果依赖方程(丢番图方程)有满足上述条件的整数解(i,j),那么 (1) 若 i < j , 则S ’ T
(2)若 i > j , 则T ’ S (3)若 i = j , 且 S=T ,则S ’ T 其中’ 表示间接依赖关系。 国家高性能计算中心(合肥) 2019/1/2
23
f1(I) = 2 * I ; g1(J) = 3 * J + 1 。依赖方程为:
考虑如下程序段: L1 : for I = 1 to 50 do . . . S : X(2*I) = . . . T : = X(3*I + 1 ) . . . endfor 这里: f1(I) = 2 * I ; g1(J) = 3 * J + 1 。依赖方程为: f1(I) - g1(J) = 0 2*I – 3*J = 1 , 而依赖约束为: 1≤I≤50 ,1≤J≤50。该方程的解(I,J)对应的数组变量会导致S和T之间的依赖。 国家高性能计算中心(合肥) 2019/1/2
24
循环向量化 循环向量化 将仅含有数组赋值语句的循环L转换成等价的向量语句 如:循环 for I = 1 to N do
S: A(I) = D(I) * E T: C(I) = A(I) + B(I) endfor 可以改写为等价的向量语句: S’: A(1:N) = D(1:N) * E T’: C(1:N) = A(1:N) + B(1:N) 国家高性能计算中心(合肥) 2019/1/2
25
如果将循环内的数组赋值改为相应的向量语句后,按原来语句次序执行所得结果与原来串行执行一样,那么. . .
可向量化循环 如果将循环内的数组赋值改为相应的向量语句后,按原来语句次序执行所得结果与原来串行执行一样,那么. . . 但以下循环不可向量化: for I = 1 to N do S: A(I) = A(I-1) + 1; //不能写成A(1:N) = A(0:N-1) + 1 endfor 而以下循环却可以向量化: S1: A(I) = A(I+1) + 1; //可以写成A(1:N) = A(2:N+1) + 1 为什么? 国家高性能计算中心(合肥) 2019/1/2
26
对于循环L=(L1,L2,. . ., Lm)其最内层循环Lm可向量化当且仅当:Lm中任意两个语句S和T,
可向量化循环的充要条件 对于循环L=(L1,L2,. . ., Lm)其最内层循环Lm可向量化当且仅当:Lm中任意两个语句S和T, (1) 当S<T时,不存在方向向量为(0,0,…,1)的S对T的依赖关系,T S;(三种依赖关系中任何一种) (2) 当S=T时,不存在方向向量为(0,0,…,1)的S对T的流依赖关系,T f S; 换言之,最内层循环中如果不存在与语句词法顺序相反的依赖关系(即反向依赖),则最内层循环可向量化。 再次考察: for I = 1 to N do S: A(I) = A(I-1) + 1; //不能写成A(1:N) = A(0:N-1) + 1 endfor //此循环中存在 S f S,且方向为(1),距离为(1) 国家高性能计算中心(合肥) 2019/1/2
27
S: A(I, 2:N-1) = B(I-1,2:N-1) + C T: B(I, 2:N-1) = A(I, 3:N) * 2
考查以下循环可向量化的情况。 (1)for I = 2 to N – 1 do for J = 2 to N – 1 do S : A(I, J) = B( I-1, J ) + C T : B(I, J) = A(I, J+1) * 2 endfor 如果向量化内层的J循环,则形成: for I = 2 to N – 1 do S: A(I, 2:N-1) = B(I-1,2:N-1) + C T: B(I, 2:N-1) = A(I, 3:N) * 2 但此向量化运算的结果不对!为什么? (a)存在依赖T f S, 方向为(1,0) (b)存在依赖T a S, 方向为(0, 1) 国家高性能计算中心(合肥) 2019/1/2
28
S: A(I, 2:N-1) = B(I-1,2:N-1) + C T: B(I, 2:N-1) = A(I, 3:N) * 2
考查以下循环可向量化的情况。 (1)for I = 2 to N – 1 do for J = 2 to N – 1 do S : A(I, J) = B( I-1, J ) + C T : B(I, J) = A(I, J+1) * 2 endfor 如果向量化内层的J循环,则形成: for I = 2 to N – 1 do S: A(I, 2:N-1) = B(I-1,2:N-1) + C T: B(I, 2:N-1) = A(I, 3:N) * 2 向量化内层循环是错误的哦! 举例来说,在(I=2,J=2)的迭代中,原来的内层循环中语句T先行读取了A(2,3)的旧值来计算B(2,2);而在向量化后的循环中,向量化的语句S则在(I=2)迭代中先行更新了A(2,3)的值;而随后向量化语句T则只能使用新的A(2,3)来计算!显然是错误的! 国家高性能计算中心(合肥) 2019/1/2
29
考查以下循环可向量化的情况。 (2) for I = 1 to N do for J = 1 to N do
S : D(I, J) = A( I, J ) + C T : A(I+1, J+1) = B(I, J) * 2 endfor 尝试向量化内层循环如下: for I = 1 to N do S : D(I, 1:N) = A( I, 1:N ) + C T : A(I+1, 2:N+1) = B(I, 1:N) * 2 存在依赖T f S, 方向为(1,1) 向量化正确吗? 不存在(0,1)的T f S 国家高性能计算中心(合肥) 2019/1/2
30
…(外层 I 循环依然串行执行,保持I层依赖关系,如 A(2,2)的写与读。)
(2) for I = 1 to N do for J = 1 to N do S : D(I, J) = A( I, J ) + C T :A(I+1, J+1) = B(I, J) * 2 endfor 部分展开循环如下: I=1时:J = 1,2,…N S(1,1): D(1,1) = A(1,1) … T(1,1): A(2,2) = B(1,1)… S(1,2): D(1,2) = A(1,2)… T(1,2): A(2,3) = B(1,2)… …(外层 I 循环依然串行执行,保持I层依赖关系,如 A(2,2)的写与读。) I=2时:J=1,2,…,N S(2,1): D(2,1) = A(2,1) … T(2,1): A(3,2) = B(2,1)… S(2,2): D(2,2) = A(2,2)… T(2,2): A(3,3) = B(2,2)… … 向量化为: D(1,1:N) = A(1,1:N)… 向量化为: A(2,2:N+1) = B(1,1:N)… 向量化为: D(2,1:N) = A(2,1:N)… 向量化为: A(3,2:N+1) = B(2,1:N)… 国家高性能计算中心(合肥) 2019/1/2
31
循环并行化 循环并行化 将循环的迭代空间划分成不同的子集,分布到不同的处理机上执行(此时对各迭代子集的执行次序不作要求)。一般用doall(或 par-do)表示将循环并行化。 可并行化循环 如果一个循环的各个迭代(子集)可按任意次序执行而结果与串行执行相同的话。 以下循环可以并行化: for I = 1 to N do doall I = 1 to N A(I) = A(I) + B(I) A(I) = A(I) + B(I) endfor enddoall 国家高性能计算中心(合肥) 2019/1/2
32
可并行化循环的充要条件 循环L=(L1,L2,. . ., Lm)中内层循环Lk可并行化当且仅当循环L中不存在层次为k的依赖关系,即不存在方向向量为(0,…,0,1k,*,…,*)(含k-1个前导零)的依赖关系(即由K层携带的依赖关系)。 考察以下循环: L1: for I = 0 to 4 do L2: for J = 0 to 4 do S: X(I+1, J+2) = Y( I, J) + 1 T: Y(I+2, J+1) = X(I, J) + 1 endfor for I = 1 to N do for J = 1 to M do X(I, J) = X( I, J-1) + X(I, J+1) endfor 存在方向为(1,1)的依赖关系: S T 和 T S 存在方向为(0,1)的依赖关系 国家高性能计算中心(合肥) 2019/1/2
33
for I = 1 to N do for J = 1 to M do X(I, J) = X( I, J-1) + X(I, J+1)
endfor L1: for I = 0 to 4 do L2: for J = 0 to 4 do S: X(I+1, J+2) = Y( I, J) + 1 T: Y(I+2, J+1) = X(I, J) + 1 endfor 并行化 外层循环I 并行化内层循环J doall I = 1 to N for J = 1 to M do X(I, J) = X( I, J-1) + X(I, J+1) endfor enddoall L1: for I = 0 to 4 do L2: doall J = 0 to 4 S: X(I+1, J+2) = Y( I, J) + 1 T: Y(I+2, J+1) = X(I, J) + 1 enddoall endfor 国家高性能计算中心(合肥) 2019/1/2
34
循环变换 循环变换的主要目的在于发掘程序中更多的并行性
循环变换-是改变循环中语句实例的执行次序但不改变语句实例集合的程序变换技术。对于循环L中的语句实例S(i)和T(j),如果存在T(j)依赖于S(i),且在变换后的循环L’中仍然有T(j)的执行迟于S(i),那么称该循环变换合法,循环L和L’等价。 循环变换技术很多,如 循环交换、语句重排、循环分布与置换等等等等。 国家高性能计算中心(合肥) 2019/1/2
35
循环分布 循环分布(loop distribution)
是一种语句级变换,将一个循环分解为多个小循环,每个小循环和原来的循环有相同的迭代空间,只是包含的语句少些。该变换主要用于: - 分解出可向量化或可并行化的循环 - 将原循环分解为较小循环以改善cache局部性 - 创建紧嵌套循环 - 分解原循环为若干使用较少变量的循环以提高寄存器的使用效率 该变换根据语句依赖图进行其上的强连通子图分类,得到所谓凝聚图,并按其中的偏序关系执行分解后的循环 国家高性能计算中心(合肥) 2019/1/2
36
循环分布 考虑如下循环: 依赖关系如下: L1:for I = 4 to 100 do S1 f S3
S1 : A(I) = B(I-2) + 1 S2: C(I) = B(I-1) +F(I) S3: B(I) = A(I-1) + 2 S4: D(I) = D(I+1) + B(I-1) endfor 依赖关系如下: S1 f S3 S3 f S1 S3 f S2 S3 f S4 S4 a S4 国家高性能计算中心(合肥) 2019/1/2
37
S1 {S1,S3} S2 S3 {S2} {S4} S4 语句依赖图 凝聚图 国家高性能计算中心(合肥)
2019/1/2
38
这样把原循环分解成两大部分: L1: for I = 4 to 100 do S1 : A(I) = B(I-2) + 1
S3: B(I) = A(I-1) + 2 endfor L2:for I = 4 to 100 do S2: C(I) = B(I-1) +F(I) L3:for I = 4 to 100 do S4: D(I) = D(I+1) + B(I-1) 语句实例执行次序为: (1)首先执行循环L1 (2)L1执行完后,可同时执行循环L2和L3 此外: 循环L2可以并行化执行; 循环L3可以向量化执行; 国家高性能计算中心(合肥) 2019/1/2
39
语句重排 语句重排(statement reordering)是基于语句依赖图的程序变换,它改变语句的词法顺序但不改变语句间依赖关系。该变换常用于循环向量化。当循环中语句间有循环依赖关系时,可通过此变换将与语句执行顺序相反的依赖关系改变为与语句执行顺序一致的依赖关系,从而使循环向量化。 考虑如下循环例1: L : for I = 2 to N do S1 : A(I) = B(I) + C(I+1) S2: D(I) = A(I+1) + 1 S3: C(I) = D(I) endfor 国家高性能计算中心(合肥) 2019/1/2
40
S2 a S1 S1 a S3 和 S2 f S3,其中依赖关系 S2 a S1使得循环不能向量化。
上述循环中依赖关系为: S2 a S1 S1 a S3 和 S2 f S3,其中依赖关系 S2 a S1使得循环不能向量化。 S1 S2 语句重排 S2 S1 S3 S3 原语句依赖图 重排后的语句依赖图 国家高性能计算中心(合肥) 2019/1/2
41
语句重排后,原来的循环可以向量化,语句顺序为: S2:D(2:N) = A(3:N+1) + 1
S1 : A(2:N) = B(2:N) + C(3:N+1) S3: C(2:N) = D(2:N) 国家高性能计算中心(合肥) 2019/1/2
42
循环置换 循环置换(loop permutation)是改变循环位置的程序变换,属于迭代级的变换,而循环交换即是此种变换的特例。该变换有如下特点: - 置换外层无循环依赖的循环与内层有依赖的循环,使得置换后内层可向量化; - 置换无依赖的循环到外层使得整个循环嵌套可以并行执行,可增加每次迭代的并行粒度并减少障碍同步次数; - 在有多层可向量化的循环时,置换范围较大的循环到外层可以增加向量的长度。 国家高性能计算中心(合肥) 2019/1/2
43
循环中存在(0,1)的依赖关系TS,不能对内层向量化。可以利用循环置换(交换): L2: for J = 1 to M do
考虑如下循环例2 : L1 : for I = 1 to M do L2: for J = 1 to M do S : B(I,J) = A(I,J-1) T : A(I,J) = B(I,J) * C(I,J) endfor 循环中存在(0,1)的依赖关系TS,不能对内层向量化。可以利用循环置换(交换): L2: for J = 1 to M do L1: for I = 1 to M do 此时,上述循环嵌套在内层可以向量化! 国家高性能计算中心(合肥) 2019/1/2
44
S: A(I,J) = ( A(I-1,J) + A(I+1,J) ) /2 endfor
再考虑以下循环例3 : for I = 2 to N do for J = 2 to N do S: A(I,J) = ( A(I-1,J) + A(I+1,J) ) /2 endfor 此循环中依赖关系:方向向量为(1,0)的S f S和(1,0)的S a S;因此循环嵌套中外层不可并行,内层可以并行(没有依赖关系),但并行粒度仅为一条语句。可以采用交换循环的方式: 此时外层循环可以并行,其粒度为一个(内层)循环。 国家高性能计算中心(合肥) 2019/1/2
45
假定P是mXm的置换矩阵,由P定义的m层循环嵌套L的置换是合法的,当且仅当对于L的每一个方向向量,均有 P > 0 成立。
循环置换的充要条件: 假定P是mXm的置换矩阵,由P定义的m层循环嵌套L的置换是合法的,当且仅当对于L的每一个方向向量,均有 P > 0 成立。 这里mXm的置换矩阵P定义为: - 每个元素非0即1 - 每行有且仅有一个元素为1 - 每列有且仅有一个元素为1 令(i)表示P中第i列中为1的元素所在的行号,则函数:i (i)是集合{1,2,…,m}上的一个置换,它完全确定矩阵P。P可以表示为: 1, , …, m (1), (2),…, (m) P = 或 (1), (2),…, (m) 国家高性能计算中心(合肥) 2019/1/2
46
考虑循环例2和例3: 对于例2,置换矩阵P = [ 2, 1 ] , 而原循环中的方向向量为 = (0,1), P = (0,1) [ 2,1 ] = ( 1,0 ) > 0。因此该循环交换是合法的。 对于例3,置换矩阵P = [ 2, 1 ] , 而原循环中的方向向量为 = (1,0), P = (1,0) [ 2,1 ] = ( 0,1 ) > 0。因此该循环交换是合法的。 这里P=[2,1] 其矩阵形式为: 而P’= [3, 2, 1]的矩阵形式为: 0 1 国家高性能计算中心(合肥) 2019/1/2
47
循环逆转 循环逆转(loop reversal)-颠倒循环中迭代执行的顺序,改变了循环迭代方向的变换,也使得变换循环中方向向量发生逆转。
如果循环在逆转变换后,它的方向向量均为正向量,则称该变换前后的循环等价,该变换是合法的。 考虑如下循环例4: for I = 1 to 100 do for J = 1 to 5 do S: A(I,J) = A(I-1,J+1) +1 endfor 国家高性能计算中心(合肥) 2019/1/2
48
循环例4的迭代依赖图如下,可知它含有方向向量为
(1,-1)的依赖关系,其内层循环可以并行化(但粒度为5次迭代),其外层不能并行化,也不能进行循环交换。(为什么?) 对循环J进行并行,粒度为5次迭代 国家高性能计算中心(合肥) 2019/1/2
49
但对例4中,循环J进行逆转,则方向向量变为(1,1)。
可以对循环嵌套进行循环交换。此时内层循环I可以并行化(粒度为100次迭代!),迭代依赖图如右所示: for J = 5 downto 1 do for I = 1 to 100 do S: A(I,J) = A(I-1,J+1) +1 endfor 国家高性能计算中心(合肥) 2019/1/2
50
圈收缩 圈收缩(cycle shrinking)-此变换技术一般用于依赖距离大于1的循环中,它将一个串行循环分成两个紧嵌套循环,其中外层依然串行执行,而内层则是并行执行(一般粒度较小)。 考虑循环例5:(K 为正整数) for I = 0 to N do S: A(I+K) = B(I) T: B(I+K) = A(I) + C(I) endfor S T 语句依赖图 国家高性能计算中心(合肥) 2019/1/2
51
循环例5既不能向量化,也不能并行化(why?) 考察(K=4时)迭代依赖图:
for J = 0 to N step K doall I = J to J+K-1 S: A(I+K) = B(I) T: B(I+K) = A(I) + C(I) enddoall endfor 国家高性能计算中心(合肥) 2019/1/2
Similar presentations