GCD test
In compiler theory, a greatest common divisor test is the test used in study of loop optimization and loop dependence analysis to test the dependency between loop statements.
Description
A greatest common divisor test is a test used in computer science compiler theory to study of loop optimization and loop dependence analysis to test the dependency between loop statements.Use
Whenever a sequential loop like for loop is made to be parallel so that it can be executed on more than one processor—as in case of grid computing or cluster computing—then certain dependencies are checked to know whether the loop can be parallelized. According to this test, by comparing the indices of two arrays present in two or more statements, it can be calculated whether it is legal to parallelize the loop or not.Rationale
Theorem
A linear Diophantine equationa1*x1 + a2*x2 +... + an*xn =c
has an integer solution x1, x2,..., xn iff GCD divides c.
E.g.
2*x1 -2*x2 =1
GCD =2, 2 cannot divide 1. So, there is no integer solution for the equation above.
Dependency analysis
It is difficult to analyze array references in compile time to determine data dependency. A simple and sufficient test for the absence of a dependence is the greatest common divisor test. It is based on the observation that if a loop carried dependency exists between X and X, then GCD must divide. The assumption is that the loop must be normalized – written so that the loop index/variable starts at 1 and gets incremented by 1 in every iteration. For example, in the following loop, a=2, b=3, c=2, d=0 and GCD=2 and is -3. Since 2 does not divide -3, no dependence is possible.for
Process
Loop code in general:for
To decide if there is loop carried dependence between a and a, one usually needs to solve the equation
x*i1 +k = y*i2+m
Where 0<=i1, i2
A concrete example source code in C would appear as:
for
The GCD of is 2 and dividend is 1. As 2 can not divide 1 properly, there is no dependency between s1 and s2 and various other loop transformation methods can be applied.