C++ code generation: any way of deflating large expressions?

hugo_lec at club-internet.fr hugo_lec at club-internet.fr
Thu Jul 10 20:06:13 CEST 2003

  I also worked on such a program : I have to convert huge 
expressions in  
optimized C++ code (to automate design of finite element code). I 
tried to  
make something which does not calculate two times the same 
thing. There's an  
algorithm to use the less temporary variables as possible (in order 
to help  
the compiler to optimize). It also looks for factorizations with * and 
(A=x*y; B=sin(x*y*z) -> B=sin(A*z)... ) and for the cost of 
(A=x/y; B=z/y; gives double tmp0=1/y; A=x*tmp0; B=z*tmp0)... It can 
code for huge expressions in a few seconds. 
  It is a bit crappy because it does not use the internal 
representation given  
by GiNaC. But if someone wants to clean it... For now it is usable 
enough for  
  A simple example : 
Optimized_ex_output mm("float"); 
symbol x ("x"), y ("y"), z ("z"), u("u"), v("v"); 
mm.add ("A{1]", x/u*v, true); 
mm.add ("B", (x+y)/u*v+cos((x+y+z)*y), false); 
mm.write(std::cout,2); // 2 spaces before each line 
mm.display_tree(); // graph output 
  produces : 
float reg0 = v; 
float reg1 = z; 
float reg2 = u; 
float reg3 = x; 
float reg4 = y; 
float reg5 = reg3; 
reg3 += reg4; 
reg2 = 1 / reg2; 
float reg6 = reg2; 
reg2 *= reg3; 
reg2 *= reg0; 
reg0 *= reg6; 
reg3 += reg1; 
reg4 *= reg3; 
reg0 *= reg5; 
A{1] += reg0; 
reg4 =  cos( reg4 ); 
reg4 += reg2; 
float B = reg4; 
  (and a nice dot graph) 
  In the near future, I've planed to allow generation of vectorial code 
produce 4x the same calculi on different data. I've also planed to 
code for GPUs but not for the near future. 
  Hugo LECLERC. 

-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: optimized_ex_output.tbz2
Url: http://www.cebix.net/pipermail/ginac-list/attachments/20030710/70cb0abd/optimized_ex_output.ksh

More information about the GiNaC-list mailing list