[Haskell-cafe] blas bindings, why are they so much slower the C?

Richard A. O'Keefe ok at cs.otago.ac.nz
Wed Jun 18 20:17:58 EDT 2008

On 19 Jun 2008, at 4:16 am, Anatoly Yakovenko wrote:
> C doesn't work like that :).  functions always get called.

Not true.  A C compiler must produce the same *effect* as if
the function had been called, but if by some means the compiler
knows that the function has no effect, it is entitled to skip
the call.  In particular, the C compiler I normally use offers
these pragmas, amongst others:

#pragma does_not_write_global_data (funcname [, funcname])
#pragma no_side_effect(funcname[, funcname])

So with a declaration like

	extern double cblas_ddot(
		        double const *, int,
                         double const *, int);
	#pragma no_side_effect (cblas_ddot)
the compiler would be completely within its rights to discard
any call to cblas_ddot() whose result was not used.  (As it
happens, it didn't, but it would have been allowed to.)
If using gcc,

	extern double cblas_ddot( ... as before ...)
		__attribute__ ((const));

seems to have the same effect, certainly the test case I tried
did in fact completely eliminate a call to cblas_ddot() when
so declared.

Since the malloc() results pointed to uninitialised memory,
the C compiler was entitled to do anything it pleased anyway.

More information about the Haskell-Cafe mailing list