[gambit-list] compiling fib

Bradley Lucier lucier at math.purdue.edu
Fri Jan 21 14:59:03 EST 2011


On Fri, 2011-01-21 at 14:38 -0500, Marc Feeley wrote:

> 
> On 2011-01-21, at 1:59 PM, Bradley Lucier wrote:
> > 
> 
> > On my box, I don't have chicken installed, but
> 
> > 
> > heine:~> time ./fib_c
> > 1.490u 0.000s 0:01.49 100.0%	0+0k 0+0io 0pf+0w
> > 
> 
> > and after compilation
> 
> > 
> > heine:~> time gsi fib_scm
> > 4.860u 0.010s 0:04.87 100.0%	0+0k 0+0io 0pf+0w
> > 
> 
> > So, it looks like Chicken really smokes Gambit on this
> femtobenchmark.  The question is, should it?
> 
> 
> 
> To really draw such conclusions, you should actually compile and run
> the program with Chicken!  There are so many factors that can affect
> performance (actual CPU you are using, version of gcc, version of
> Chicken, etc).


OK, so I installed chicken, for chicken used


heine:~> gcc -v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.4.4-14ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5) 


for Gambit used


heine:~> gsc -v
v4.6.0 20110117205308 x86_64-unknown-linux-gnu "./configure CC=/usr/bin/gcc-4.5 -fschedule-insns -march=native --enable-multiple-versions --enable-single-host --enable-shared"

(so I added "-fschedule-insns -march=native") and

heine:~> gcc-4.5 -v
Using built-in specs.
COLLECT_GCC=gcc-4.5
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.5.1/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.5.1-7ubuntu2' --with-bugurl=file:///usr/share/doc/gcc-4.5/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.5 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.5 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin --enable-gold --with-plugin-ld=ld.gold --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.5.1 (Ubuntu/Linaro 4.5.1-7ubuntu2) 

and got

heine:~> /pkgs/chicken-4.6.0/bin/csc -O5 fib_scm.scm
heine:~> time ./fib_scm
1.120u 0.010s 0:01.13 100.0%	0+0k 0+0io 0pf+0w



> Have you checked the assembly code that is generated by gcc -O3 for
> fib_c .  It is quite amazing.  gcc manages to rewrite the code to
> remove one of the two recursive calls.  I have a hunch that the gcc
> folks put in an optimization specifically for fib-like recursions... 


I think they just note that with descending recursions the left-most one
can be unrolled to a loop.


> If you compile fib_c with -O2 the program runs 3 times slower!


Your point is?  If I use tiny-c, presumably the code would suck more,
too.


> Don't forget also that Gambit uses gcc -O1 by default to compile the
> generated C code because at -O2, gcc undoes some of Gambit's
> optimizations.
> 
> 
> 
> Also, it just so happens that because the base case uses the test (or
> (fx= n 0) (fx= n 1)) the body of fib is just slightly too big to be
> inlined at the recursive calls to fib.  If the base case is rewritten
> to (fx<= n 1) then the function gets inlined and the performance
> improves drastically.  Also, you didn't play around much with the
> Gambit declarations... if you add (inlining-limit 1000), you will
> enable more inlining.  The code below runs 2.1 times faster than your
> original fib_scm .
> 
> 
> (declare
>  (standard-bindings)
>  (extended-bindings)
>  (block)
>  (inlining-limit 1000) ;; ADDED
>  (not safe)
> )
> 
> (define (fib n)
>   (if (fx<= n 1)  ;; CHANGED FROM: (or (fx= n 0) (fx= n 1))
>       n
>       (fx+ (fib (fx- n 1))
>            (fib (fx- n 2)))))
> 
> (do ((n 0 (fx+ n 1)))
>     ((fx= n 40))
>   (for-each display
>             (list "fib(" n ")=" (fib n) #\newline)))


On my machine I get:


heine:~> gsc -exe fib2_scm.scm 
heine:~> time ./fib2_scm
2.150u 0.010s 0:02.16 100.0%	0+0k 0+0io 0pf+0w

and if I run it through chicken I get

heine:~> /pkgs/chicken-4.6.0/bin/csc -O5 fib2_scm.scm

Warning: illegal declaration specifier: (inlining-limit 1000)
heine:~> time ./fib2_scm
0.980u 0.000s 0:00.98 100.0%	0+0k 0+0io 0pf+0w

Still smoked, only worse ...


> The x86 back-end runs fib_scm about 2.5 times faster than when using the C back-end.


What kind of speedups do you see on your new version of fib with the
native back end?

Brad
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.iro.umontreal.ca/pipermail/gambit-list/attachments/20110121/596963d1/attachment.htm>


More information about the Gambit-list mailing list