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
}
Ejemplo n.º 2
0
    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>()();
        }
      }