/** * \return the command lines options of the petsc backend */ po::options_description backendpetsc_options( std::string const& prefix ) { std::string _prefix = prefix; if ( !_prefix.empty() ) _prefix += "-"; po::options_description _options( "BackendPetsc " + prefix + " solver options" ); _options.add_options() // solver options ( ( _prefix+"petsc-solver-type" ).c_str(), Feel::po::value<std::string>()->default_value( "umfpack" ), "umfpack, superlu, cg, bicgstab, gmres" ) // preconditioner options ( ( _prefix+"petsc-pc-type" ).c_str(), Feel::po::value<std::string>()->default_value( "ilut" ), "ilut, ilutp, diag, id" ) ( ( _prefix+"petsc-threshold" ).c_str(), Feel::po::value<double>()->default_value( 1e-3 ), "threshold value for preconditioners" ) ( ( _prefix+"petsc-fillin" ).c_str(), Feel::po::value<int>()->default_value( 2 ), "fill-in level value for preconditioners" ) // solver control options ( ( _prefix+"petsc-restart" ).c_str(), Feel::po::value<int>()->default_value( 20 ), "number of iterations before solver restarts (gmres)" ) ( ( _prefix+"petsc-verbose" ).c_str(), Feel::po::value<int>()->default_value( 0 ), "(=0,1,2) print solver iterations" ) ( ( _prefix+"petsc-maxiter" ).c_str(), Feel::po::value<int>()->default_value( 1000 ), "set maximum number of iterations" ) ( ( _prefix+"petsc-tolerance" ).c_str(), Feel::po::value<double>()->default_value( 2e-10 ), "set solver tolerance" ) ; return _options; }
po::options_description solvereigen_options( std::string const& prefix ) { std::string _prefix = prefix; boost::algorithm::trim( _prefix ); if ( !_prefix.empty() && !boost::algorithm::ends_with( _prefix, "-" ) ) _prefix += "-"; //int nev, // number of requested eigenpairs //int ncv, // number of basis vectors //const double tol, // solver tolerance //const unsigned int m_its) // maximum number of iterations po::options_description _options( "Solver EigenValue Slepc -- " + prefix + " solver options" ); _options.add_options() // solver options ( ( _prefix+"solvereigen-solver-type" ).c_str(), Feel::po::value<int>()->default_value( KRYLOVSCHUR ), "type of eigenvalue solver" ) ( ( _prefix+"solvereigen-problem-type" ).c_str(), Feel::po::value<int>()->default_value( NHEP ), "type of eigenvalue problem" ) ( ( _prefix+"solvereigen-position" ).c_str(), Feel::po::value<int>()->default_value( LARGEST_MAGNITUDE ), "eigenvalue solver position in spectrum: LARGEST_MAGNITUDE=0, SMALLEST_MAGNITUDE=1, LARGEST_REAL=2, SMALLEST_REAL=3, LARGEST_IMAGINARY=4, SMALLEST_IMAGINARY=5" ) ( ( _prefix+"solvereigen-nev" ).c_str(), Feel::po::value<int>()->default_value( 1 ), "number of requested eigenpairs" ) ( ( _prefix+"solvereigen-ncv" ).c_str(), Feel::po::value<int>()->default_value( 3 ), "number of basis vectors" ) ( ( _prefix+"solvereigen-tol" ).c_str(), Feel::po::value<double>()->default_value( 1e-10 ), "solver tolerance" ) ( ( _prefix+"solvereigen-maxiter" ).c_str(), Feel::po::value<int>()->default_value( 10000 ), "maximum number of iterations" ); return _options; }
RocksEngine::RocksEngine(const std::string& path, bool durable) : _path(path), _durable(durable) { { // create block cache uint64_t cacheSizeGB = 0; ProcessInfo pi; unsigned long long memSizeMB = pi.getMemSizeMB(); if (memSizeMB > 0) { double cacheMB = memSizeMB / 2; cacheSizeGB = static_cast<uint64_t>(cacheMB / 1024); } if (cacheSizeGB < 1) { cacheSizeGB = 1; } _block_cache = rocksdb::NewLRUCache(cacheSizeGB * 1024 * 1024 * 1024LL); } // open DB rocksdb::DB* db; auto s = rocksdb::DB::Open(_options(), path, &db); ROCKS_STATUS_OK(s); _db.reset(db); // open iterator boost::scoped_ptr<rocksdb::Iterator> _iter(_db->NewIterator(rocksdb::ReadOptions())); // find maxPrefix _maxPrefix = 0; _iter->SeekToLast(); if (_iter->Valid()) { // otherwise the DB is empty, so we just keep it at 0 bool ok = extractPrefix(_iter->key(), &_maxPrefix); // this is DB corruption here invariant(ok); } // load ident to prefix map { boost::mutex::scoped_lock lk(_identPrefixMapMutex); for (_iter->Seek(kMetadataPrefix); _iter->Valid() && _iter->key().starts_with(kMetadataPrefix); _iter->Next()) { rocksdb::Slice ident(_iter->key()); ident.remove_prefix(kMetadataPrefix.size()); // this could throw DBException, which then means DB corruption. We just let it fly // to the caller BSONObj identConfig(_iter->value().data()); BSONElement element = identConfig.getField("prefix"); // TODO: SERVER-16979 Correctly handle errors returned by RocksDB // This is DB corruption invariant(!element.eoo() || !element.isNumber()); uint32_t identPrefix = static_cast<uint32_t>(element.numberInt()); _identPrefixMap[StringData(ident.data(), ident.size())] = identPrefix; } } }
/*! \brief Builds this Program. * * Do not forget to load Kernel objects into this * Program before executing this function. * This Program with all Kernel objects are built. Note that * compiling and linking in seperate stages are note supported * yet. Kernels built with this Program * can be executed on all Device objects within the Context * for which this Program is built. */ void ocl::Program::build() { TRUE_ASSERT(this->_context != 0, "Program has no Context"); TRUE_ASSERT(this->_id == 0, "Program already built"); TRUE_ASSERT(!_kernels.empty(), "No kernels loaded for the program"); std::stringstream stream; this->print(stream); const std::string &t = stream.str(); cl_int status; const char * file_char = t.c_str(); // stream.str().c_str(); _id = clCreateProgramWithSource(this->context().id(), 1, (const char**)&file_char, NULL, &status); OPENCL_SAFE_CALL(status); cl_int buildErr = clBuildProgram(_id, 0, NULL, _options().c_str(), NULL, NULL); checkBuild(buildErr); for(auto k : _kernels){ k.second->create(); } }
/*! \brief Builds this Program. * * Do not forget to load Kernel objects into this * Program before executing this function. * This Program with all Kernel objects are built. Note that * compiling and linking in seperate stages are note supported * yet. Kernels built with this Program * can be executed on all Device objects within the Context * for which this Program is built. */ void ocl::Program::build() { if(this->_context == 0)throw std::runtime_error( "Program has no Context"); if(this->_id != 0) throw std::runtime_error( "Program already built"); if(_kernels.empty()) throw std::runtime_error( "No kernels loaded for the program"); std::stringstream stream; this->print(stream); std::string t = stream.str(); // std::cout << t << std::endl; cl_int status; const char * file_char = t.c_str(); // stream.str().c_str(); _id = clCreateProgramWithSource(this->context().id(), 1, (const char**)&file_char, NULL, &status); OPENCL_SAFE_CALL(status); cl_int buildErr = clBuildProgram(_id, 0, NULL, _options().c_str(), NULL, NULL); checkBuild(buildErr); for(auto& k : _kernels){ k->create(); } }
RocksEngine::RocksEngine(const std::string& path, bool durable) : _path(path), _durable(durable), _maxPrefix(0) { { // create block cache uint64_t cacheSizeGB = rocksGlobalOptions.cacheSizeGB; if (cacheSizeGB == 0) { ProcessInfo pi; unsigned long long memSizeMB = pi.getMemSizeMB(); if (memSizeMB > 0) { double cacheMB = memSizeMB / 2; cacheSizeGB = static_cast<uint64_t>(cacheMB / 1024); } if (cacheSizeGB < 1) { cacheSizeGB = 1; } } _block_cache = rocksdb::NewLRUCache(cacheSizeGB * 1024 * 1024 * 1024LL, 6); } _maxWriteMBPerSec = rocksGlobalOptions.maxWriteMBPerSec; _rateLimiter.reset( rocksdb::NewGenericRateLimiter(static_cast<int64_t>(_maxWriteMBPerSec) * 1024 * 1024)); // open DB rocksdb::DB* db; auto s = rocksdb::DB::Open(_options(), path, &db); invariantRocksOK(s); _db.reset(db); _counterManager.reset( new RocksCounterManager(_db.get(), rocksGlobalOptions.crashSafeCounters)); _compactionScheduler.reset(new RocksCompactionScheduler(_db.get())); // open iterator boost::scoped_ptr<rocksdb::Iterator> iter(_db->NewIterator(rocksdb::ReadOptions())); // find maxPrefix iter->SeekToLast(); if (iter->Valid()) { // otherwise the DB is empty, so we just keep it at 0 bool ok = extractPrefix(iter->key(), &_maxPrefix); // this is DB corruption here invariant(ok); } // load ident to prefix map. also update _maxPrefix if there's any prefix bigger than // current _maxPrefix { boost::lock_guard<boost::mutex> lk(_identPrefixMapMutex); for (iter->Seek(kMetadataPrefix); iter->Valid() && iter->key().starts_with(kMetadataPrefix); iter->Next()) { invariantRocksOK(iter->status()); rocksdb::Slice ident(iter->key()); ident.remove_prefix(kMetadataPrefix.size()); // this could throw DBException, which then means DB corruption. We just let it fly // to the caller BSONObj identConfig(iter->value().data()); BSONElement element = identConfig.getField("prefix"); if (element.eoo() || !element.isNumber()) { log() << "Mongo metadata in RocksDB database is corrupted."; invariant(false); } uint32_t identPrefix = static_cast<uint32_t>(element.numberInt()); _identPrefixMap[StringData(ident.data(), ident.size())] = identPrefix; _maxPrefix = std::max(_maxPrefix, identPrefix); } } // just to be extra sure. we need this if last collection is oplog -- in that case we // reserve prefix+1 for oplog key tracker ++_maxPrefix; // load dropped prefixes { rocksdb::WriteBatch wb; // we will use this iter to check if prefixes are still alive boost::scoped_ptr<rocksdb::Iterator> prefixIter( _db->NewIterator(rocksdb::ReadOptions())); for (iter->Seek(kDroppedPrefix); iter->Valid() && iter->key().starts_with(kDroppedPrefix); iter->Next()) { invariantRocksOK(iter->status()); rocksdb::Slice prefix(iter->key()); prefix.remove_prefix(kDroppedPrefix.size()); prefixIter->Seek(prefix); invariantRocksOK(iter->status()); if (prefixIter->Valid() && prefixIter->key().starts_with(prefix)) { // prefix is still alive, let's instruct the compaction filter to clear it up uint32_t int_prefix; bool ok = extractPrefix(prefix, &int_prefix); invariant(ok); { boost::lock_guard<boost::mutex> lk(_droppedPrefixesMutex); _droppedPrefixes.insert(int_prefix); } } else { // prefix is no longer alive. let's remove the prefix from our dropped prefixes // list wb.Delete(iter->key()); } } if (wb.Count() > 0) { auto s = _db->Write(rocksdb::WriteOptions(), &wb); invariantRocksOK(s); } } }