/** * \brief Allocate size bytes. * * \param size Number of bytes. * * \return pointer to allocated memory block. */ void *m4ri_mmc_malloc(size_t size) { #ifdef __M4RI_ENABLE_MMC void *ret = NULL; #if __M4RI_HAVE_OPENMP #pragma omp critical (mmc) { #endif mmb_t *mm = m4ri_mmc_cache; if (size <= __M4RI_MMC_THRESHOLD) { for (int i = 0; i < __M4RI_MMC_NBLOCKS; ++i) { if(mm[i].size == size) { ret = mm[i].data; mm[i].data = NULL; mm[i].size = 0; break; } } } #if __M4RI_HAVE_OPENMP } #endif if (ret) return ret; else return m4ri_mm_malloc(size); #else // __M4RI_ENABLE_MMC return m4ri_mm_malloc(size); #endif // __M4RI_ENABLE_MMC }
mzp_t *mzp_init(size_t length) { size_t i; mzp_t *P = (mzp_t*)m4ri_mm_malloc(sizeof(mzp_t)); P->values = (size_t*)m4ri_mm_malloc(sizeof(size_t)*length); P->length = length; for (i=0; i<length; i++) { P->values[i] = i; } return P; }
mzp_t *mzp_init_window(mzp_t* P, size_t begin, size_t end){ mzp_t *window = (mzp_t *)m4ri_mm_malloc(sizeof(mzp_t)); window->values = P->values + begin; window->length = end-begin; return window; }