260 likes | 394 Views
This document details the importance and strategies of code optimization in MATLAB, focusing on the Compaan problem statement. It discusses why optimization is essential, where it can be applied, and the techniques for improving performance. The provided MATLAB code examples illustrate single assignment code, conditional structures, and lattice intersection analysis. The advantages of these methods include reduced complexity, fewer conditional statements, and explicit data dependencies. Key insights for enhancing program efficiency are shared, promoting better coding practices.
E N D
Problem statement • 1. Why code optimization ? • 2. Where to do code optimization? • 3. How to do code optimization ?
Peter Held Test (Modified) • for i = 1 : 2 : 10, • for j = 1 : 2 : 10, • if i-3*div(i,3) <= 0, • [ a(i,j) ] = funcA(); • end • if j-3*div(j,3) <= 0, • [ ] = funcB( a(i,j) ); • end • end • end Matlab Code:
Peter Held Test • Single Assignment Code (SAC): for i = 1 : 2 : 10, for j = 1 : 2 : 10, if -i+3*div(i,3) >= 0, [out_0]=funcA( ); [a_1(i,j)]=opd(out_0); end if -j+3*div(j,3) >= 0, d3 = div(i+1,2); if -i+2*d3-1 >= 0, d4 = div(j+1,2); if -j+2*d4-1 >= 0, d5 = div(2*d3+2,3); if -I+3*d5-3 >= 0, [in_0]=ipd(a_1(3*d5-3, 2*d4-1)); else %%if i-3*d5+2 >=0, [in_0]=ipd(a(i,j)); end end end [ ]=funcB(in_0); end end end
Parse Tree of SAC for i=1:2:10 for j=1:2:10 if -i+3*div(i,3)>=0 if -j+3*div(j,3)>=0 d3=div(i+1,2) []=funcB(in_0) [out_0]=funcA() [a_1(i,j)]=opd(out_0) if -i+2*d3-1>=0 d4=div(j+1,2) if -j+2*d4-1>=0 d5=div(2*d3+2,3) if -i+3*d5-3>=0 if i-3*d5+2>=0 [in_0]=ipd(a_1(3*d5-3,2*d4-1)) [in_0]=ipd(a(i,j)) high dimension dense polytope lattice ?
Lattice and Z-Polyhedron j j j i i Lattice L Z-Polyhedron Z i Polyhedron P P = { ( i , j ) | 1 i 6, 1 j 9 } L = { ( i , j ) | 2 i + 1, 2 j + 1 } Z = P L Z = { ( 2 i + 1 , 2 j +1 ) | 0 2 i 5, 0 2 j 8 }
Top-down Analysis <1> : For-loop j i for i = 1 : 2 : 10, for j = 1 : 2 : 10, for i = 1 : 1 : 10, for j = 1 : 1 : 10, d0 = div(i,2); if i-2*d0-1 >= 0, d1 = div(j,2); if j-2*d1-1 >= 0, for i = 1 : 1 : 10, for j = 1 : 1 : 10, if mod(i-1,2) == 0, if mod(j-1,2) == 0,
Top-down Analysis <2> : for loop + “if” for i = 1 : 1 : 10, for j = 1 : 1 : 10, d0 = div(i,2); if i-2*d0-1 >= 0, d1 = div(j,2); if j-2*d1-1 >= 0, for i = 1 : 1 : 10, for j = 1 : 1 : 10, if mod(i-1,2) == 0, if mod(j-3,6) == 0, d2 = div(j,3); if -j+3*d2 >= 0,
Top-down Analysis <3> Redundant! i j Domain of dependency: d3 = div(i+1,2); if -i+2*d3-1 >= 0, d4 = div(j+1,2); if -j+2*d4-1 >= 0, d5 = div(2*d3+2,3); if -i+3*d5-3 >= 0, [in_0] = ipd( a_1(3*d5-3, 2*d4-1) ); if mod(i-3,6) == 0, if mod(j+1,2) == 0, [in_0] =ipd(a_1(i,j));
Top-down Analysis <4> : Put it together ? Redundant! for i = 1 : 1 : 10, for j = 1 : 1 : 10, if mod(i-1,2) == 0, if mod(j-3,6) == 0, if mod(i-3,6) == 0, if mod(j+1,2) == 0, [in_0]=ipd(a_1(i,j));
Holy Cup Lattice Intersection for i = 1 : 1 : 10, for j = 1 : 1 : 10, if mod(i-3,6) == 0, if mod(j-3,6) == 0, [in_0]=ipd(a_1(i,j));
How to get the lattice? lattice? for i = 1 : 1 : 10, for j = 1 : 1 : 10, d0 = div(i,2); if i-2*d0-1 >= 0, d1 = div(j,2); if j-2*d1-1 >= 0, d2 = div(j,3); if -j+3*d2 >= 0, d3 = div(i+1,2); if -i+2*d3-1 >= 0, d4 = div(j+1,2); if -j+2*d4-1 >= 0, d5 = div(2*d3+2,3); if -i+3*d5-3 >= 0, [in_0] = ipd( a_1(3*d5-3, 2*d4-1) ); else if i-3*d5+2 >= 0, [in_0] = ipd( a(i,j) ); end end end [] = funcB( in_0 ); end end end
System of inequalities div if
Solution Particular solution not in the null space • 1. N has a null space of dimension 2, so there exists 2 linearly independent vectors ( c1, c2 ) or C2 such that : N ( C2Kf ) == 0 • So, if is a solution, then + C2 Kf is also • a solution. • 2. Hermite Normal Form ( HNF ) • N C = [ H 0 ] => N [ C1 C2 ] =0 => N C2 Kf = 0 • So, I = C21 Kf + O
Solution (cont.) So O=C11Kb Bounded by(*) & (**).
Sum up • So, the lattice corresponding to the polytope is defined by: • I = C21 Kf + O & O = C11 Kb • b1 <= N C1 Kb <= b2 • Nq C1 Kb <= bq • In our example, • C21 = 6 0 & O = 9 • 0 6 3
Else statement O= 9 ipd(a_1(i,j)) 3 O= 7 ipd(a(i,j)) 3 O= 5 ipd(a(i,j)) 3 … … d5 = div(2*d3+2,3); if -i+3*d5-3 >= 0, [in_0]=ipd(a_1(3*d5-3, 2*d4-1)); else %%if i-3*d5+2 >= 0, [in_0]=ipd(a(i,j)); end … …
Altogether for i = 1 : 1 : 10, for j = 1 : 1 : 10, if mod(i-3,6) == 0, if mod(j-1,2) == 0, [out_0]=funcA(); [a_1(i,j)]=opd(out_0); if mod(j-3,6) == 0, if mod(i-3,6) == 0, [in_0]=ipd(a_1(i,j)); else if mod(i-5,6) == 0, [in_0]=ipd(a(i,j)); else if mod(i-7,6) == 0, [in_0]=ipd(a(i,j)); end [ ] = funcB(in_0); end end end
Conclusion <1> • By introducing lattice, we can reduce the complexity of the program. The improvements are as follows: • No control variables ; • Less div and if statements ; • The data dependency becomes explicit.
Is that the whole story? d = div(i-3, 6); if i-3-6*d <= 0, • Observation : • We have to express those “mod”s with “div”s + “if”s : if mod(i-3, 6) == 0
Further analysis Z-Polyhedron Polyhedral image ?
Further analysis (cont.) Polyhedral preimage
Further analysis (cont.) So, if we set O = [ -3 -3 ], which gives us the same system, we can express the mod with a div and a if: d = div(i+3, 6); if i+3-6*d <= 0, if mod(i+3, 6) == 0
Conclusion <2> • Providing that the lattice is invertable, we can get a dense polyhedron by preimaging the Z-polyhedron. The integer points in the dense polyhedron have a one-to-one affine mapping to the integer points in the Z-polyhedron.
Things to be done • 1. Compute the offset. Pip ? or … … • 2. Rewrite the program in a reduced form using lattice ; • 3. Testing.