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

Anatoly Yakovenko aeyakovenko at gmail.com
Wed Jun 18 12:16:24 EDT 2008


>> #include <cblas.h>
>> #include <stdlib.h>
>>
>> int main() {
>>   int size = 1024;
>>   int ii = 0;
>>   double* v1 = malloc(sizeof(double) * (size));
>>   double* v2 = malloc(sizeof(double) * (size));
>>   for(ii = 0; ii < size*size; ++ii) {
>>      double _dd = cblas_ddot(0, v1, size, v2, size);
>>   }
>>   free(v1);
>>   free(v2);
>> }
>
> Your C compiler sees that you're not using the result of cblas_ddot,
> so it doesn't even bother to call it. That loop never gets run. All
> your program does at runtime is call malloc and free twice, which is
> very fast :-)

C doesn't work like that :).  functions always get called.  but i did
find a problem with my C code, i am incorrectly calling the dot
production function:

#include <cblas.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main() {
   int size = 1024;
   int ii = 0;
   double dd = 0.0;
   double* v1 = malloc(sizeof(double) * (size));
   double* v2 = malloc(sizeof(double) * (size));
   for(ii = 0; ii < size; ++ii) {
      v1[ii] = 0.1;
      v2[ii] = 0.1;
   }
   for(ii = 0; ii < size*size; ++ii) {
      dd += cblas_ddot(size, v1, 0, v2, 0);
   }
   free(v1);
   free(v2);
   printf("%f\n", dd);
   return 0;
}

time ./testdot
10737418.240187

real    0m2.200s
user    0m2.190s
sys     0m0.010s

So C is about twice as fast.  I can live with that.


More information about the Haskell-Cafe mailing list