void ExtentStore::add(const Extent& extent) { assert(extent.numPages() > 0); // The new extent is not allowed to be inside an already existing extent for(auto iter : extents) if( (iter.begin().toInteger() <= extent.begin().toInteger() && extent.begin().toInteger() < iter.end().toInteger()) || (iter.begin().toInteger() < extent.end().toInteger() && extent.end().toInteger() <= iter.end().toInteger())) throw util::StupidUserException("extent store: overlapping extents"); // Add extent pageCount += extent.numPages(); if(!extents.empty() && extents.back().end() == extent.begin()) extents.back() = Extent(extents.back().begin(), extent.end()); else // Merge to last extent extents.emplace_back(extent); // Add a new extent }
FftwImpl(const Extent& cextents) { extents_ = interpret_as::column_major(cextents); extents_complex_ = extents_; n_ = std::accumulate(extents_.begin(), extents_.end(), 1, std::multiplies<std::size_t>()); if(IsComplex==false){ extents_complex_.back() = (extents_.back()/2 + 1); } n_complex_ = std::accumulate(extents_complex_.begin(), extents_complex_.end(), 1, std::multiplies<size_t>()); data_size_ = (IsInplaceReal ? 2*n_complex_ : n_) * sizeof(value_type); if(IsInplace==false) data_complex_size_ = n_complex_ * sizeof(ComplexType); //size_t total_mem = getMemorySize(); size_t total_mem = 95*getMemorySize()/100; // keep some memory available, otherwise an out-of-memory killer becomes more likely if(total_mem < 3*data_size_+data_complex_size_) { // includes host input buffers std::stringstream ss; ss << total_mem << "<" << 3*data_size_+data_complex_size_ << " (bytes)"; throw std::runtime_error("FFT data exceeds physical memory. "+ss.str()); } #if GEARSHIFFT_FFTW_THREADS==1 if( traits::thread_api<TPrecision>::init_threads()==0 ) throw std::runtime_error("fftw thread initialization failed."); traits::thread_api<TPrecision>::plan_with_threads(FftwContext::options().getNumberDevices()); #endif if(plan_rigor_ == FFTW_WISDOM_ONLY) { ImportWisdom<TPrecision>()(); } }