160 likes | 248 Views
This paper presents a data flow framework for automatic array privatization in parallel computing, emphasizing loop abstraction, inner loop analysis, privatization algorithm, and profitability tests. It discusses flow graphs, definitions, and summaries for effective transformation of code structures. The framework includes static vs. dynamic analysis, last value assignments, and the distinction between manual and automatic privatization methodologies.
E N D
Automatic Array Privatization Peng Tu and David Padua In Proceedings of the 6th Annual Workshop on Languages and Compilers for Parallel Computing, August 1993. Presented by: Karl Cheng
Contribution • data flow-based vs. dependence analysis • Extensible for interprocedural analysis • Distinguish static and dynamic last value assignment
Data Flow Framework • For the loop below: • X(1:N) = 0 • DO I = 1,N • A(1) = X(I) • DO J=2,N • Y(J) = J • A(J) = A(J-1)+Y(J) • ENDDO • ENDDO • The flow graph looks like: X(I) J A(1) Y(J) A(J)
Data Flow framework • For basic block S and the set of variables VAR in the program, we define: • DEF(S) = {v in VAR: v has outward exposed definition in S} • USE(S) = {v in VAR: v has outward exposed use in S} • KILL(S) = {v in VAR: v has a definition in S}
Data Flow framework • For the basic block in the inner loop of the previous program: • Y(J) = J • A(J) = A(J-1)+Y(J) • We define: • DEF(S) = {A(J), Y(J)} • USE(S) = {A(J-1),J} • KILL(S) = {A(J),Y(J)} J A(J-1) Y(J) A(J)
MRD • MRDin(S): set of variables always defined upon entering S • MRDin(S) = ∩t in pred(S) MRDout(t) • MRDout(S): set of variables always defined upon exiting S • MRDout(S) = (MRDin(S) – KILL(S)) U DEF(S)
MRD • X(1:N) = 0 • DO I = 1,N • A(1) = X(I) • DO J=2,N • Y(J) = J • A(J) = A(J-1)+Y(J) • ENDDO • ENDDO • Remember: • DEF(S) = {A(J), Y(J)} • USE(S) = {A(J-1),J} • KILL(S) = {A(J),Y(J)} • Now: • MRDin (S) = ∩t in pred(S) MRDout(t) = {J} • MRDout (S) = (MRDin(S) – KILL(S)) U DEF(S) = {A(J), Y(J), J} • Back edges are removed X(I) J A(J-1) Y(J) A(J) S
Abstraction of inner loops • Extends definition for basic block to 1iteration of loop body • DEFb(L) = must defined variables for 1 iteration of Loop L • DEFb(L) = ∩ (MRDout(t) : t in exits (L) • USEb(L) = possibly outward exposed variables • USEb(L) = U (USE(t) – MRDin(t)) : t in body (L) • KILLb(L) = DEFb(L) • PRIb(L) = privatizable variables: used but not exposed to definition outside of iteration • PRIb(L) = U { USE(t) : t in body(L)} - USEb(L)
Abstraction of inner loops • X(1:N) = 0 • DO I = 1,N • A(1) = X(I) • DO J=2,N • Y(J) = J • A(J) = A(J-1)+Y(J) • ENDDO • ENDDO • Remember: • MRDin (S) = ∩t in pred(S) MRDout(t) = {J} • MRDout (S) = (MRDin(S) – KILL(S)) U DEF(S) = {A(J), Y(J), J} • Now: • DEFb(L) = ∩ (MRDout(t) : t in exits (L) = {A(J), Y(J), J} • USEb(L) = U (USE(t) – MRDin(t)) : t in body (L) = {A(J-1)} • PRIb(L) = U { USE(t) : t in body(L)} - USEb(L) = {J, Y(J)} X(I) J A(J-1) Y(J) A(J) S
Abstraction of inner loops • For analysis of outer loops, we need the total effects of inner loops • List summary sets for each iteration • Use aggregated set (approximation) • If index I = [1:N], aggregate(A(I,J)) = A(1:N,J) • After this, we can treat inner loop as single node in the flow graph
Privatization Algorithm • For each statement t in body (L), if t is a nested loop, recurse to get [DEF(t),USE(t)]. Otherwise compute local DEF(t), USE(t) • Scan the loop again, contruct MRDin and MRDout • Compute Summary set for loop body • Aggregate to get the privatizable set of the entire loop • Return [DEF, USE]
Privatization Algorithm • X(1:N) = 0 • DO I = 1,N • A(1) = X(I) • DO J=2,N • Y(J) = J • A(J) = A(J-1)+Y(J) • ENDDO • ENDDO • DEFb(L) = ∩ (MRDout(t) : t in exits (L) = {A(1:N), Y(2:N),J,I} • USEb(L) = U (USE(t) – MRDin(t)) : t in body (L) = {X(I)} • PRIb(L) = U { USE(t) : t in body(L)} - USEb(L) = {J, I, A(1:N), Y(2:N)} X(I) A(1) DEF = {A(2:N), Y(2:N)} USE = {A(1)}
Profitability Test • Consider this loop: • DO I = 1,N • A(I) = … • … = A (I) • Profitability Test: If different iterations access different A(i) not profitable
Last Value Assignment • Live Analysis • LVBOT(S) = U t in succ(S) LVTOP(t) • LVTOP(S) = (LVBOT(S) – KILL(S)) U USE(S) • Static vs Dynamic • PRIbst = PRIb∩DEFb (DEFb(L) = must defined variables for 1 iteration of Loop L)
Thank You Questions?