double ATL_ptflushcache(long long size) /* * flush cache by reading enough mem; note that if the compiler gets * really smart, may be necessary to make vp a global variable so it * can't figure out it's not being modified other than during setup; * the fact that ATL_dzero is external will confuse most compilers */ { static void *vp=NULL; static double *cache=NULL; double dret=0.0; static long long i, N = 0; ATL_FC fct[ATL_NTHREADS]; if (size < 0) /* flush cache */ { ATL_assert(cache); for (i=0; i < ATL_NTHREADS; i++) { fct[i].N = N; fct[i].dp = cache+i*N; } ATL_goparallel(ATL_NTHREADS, ATL_DoWorkFC, fct, NULL); } else if (size > 0) /* initialize */ { vp = malloc(ATL_Cachelen + (size * ATL_NTHREADS)); ATL_assert(vp); cache = ATL_AlignPtr(vp); N = size / sizeof(double); ATL_dzero(N*ATL_NTHREADS, cache, 1); } else if (size == 0) /* free cache */ { if (vp) free(vp); vp = cache = NULL; N = 0; } return(dret); }
double ATL_flushcache(long long size) /* * flush cache by reading enough mem; note that if the compiler gets * really smart, may be necessary to make vp a global variable so it * can't figure out it's not being modified other than during setup; * the fact that ATL_dzero is external will confuse most compilers */ { static void *vp=NULL; static long long N = 0; double *cache; double dret=0.0; size_t i; if (size < 0) /* flush cache */ { ATL_assert(vp); cache = ATL_AlignPtr(vp); if (N > 0) for (i=0; i != N; i++) dret += cache[i]; } else if (size > 0) /* initialize */ { vp = malloc(ATL_Cachelen + size); ATL_assert(vp); N = size / sizeof(double); cache = ATL_AlignPtr(vp); ATL_dzero(N, cache, 1); } else if (size == 0) /* free cache */ { if (vp) free(vp); vp = NULL; N = 0; } return(dret); }