blob: c91cb9fe702cd54f3d1920510c5bc553ffed89bf [file] [log] [blame]
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
enum {
ITERATIONS = 131072,
size = 2048
};
static inline void
double_array_divs_variable(double * __restrict dvec1,
double * __restrict dvec2){
long i, j;
for(j = 0; j < ITERATIONS; j++)
for(i = 0; i < size; i++)
dvec1[i] /= dvec2[i];
// Can use loop interchange to turn this into:
// for(i = 0; i < size; i++) {
// double tmp1 = dvec1[i];
// double tmp2 = dvec2[i];
// for(j = 0; j < ITERATIONS; j++)
// tmp1 /= tmp2;
// dvec1[i] = tmp1;
// }
// Can then hoist 1/tmp2 out of the loop if -ffast-math is enabled.
}
int main(int argc, char *argv[]) {
double *dvec1, *dvec2;
long i;
posix_memalign((void**)&dvec1, 16, size * sizeof(double));
posix_memalign((void**)&dvec2, 16, size * sizeof(double));
printf( " %i iterations of each test. ", ITERATIONS );
printf( " inner loop / array size %i.\n", size );
// With better alias analysis of posix_memalign, we'd avoid reloading
// dvec1/dvec2 each time through the loop.
for( i = 0; i < size; i++ ) {
dvec1[i] = 1.0000001 * cosf((float)(size - i));
dvec2[i] = 1.0 + 0.0000000001 * sinf((float)i);
}
double_array_divs_variable( dvec1, dvec2 );
printf("%f\n", dvec1[0]);
return 0;
}