Пример #1
0
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);
}
Пример #2
0
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);
}