diff options
Diffstat (limited to 'src/database/database.hpp')
-rw-r--r-- | src/database/database.hpp | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/src/database/database.hpp b/src/database/database.hpp index 87c12293..b34e0d8a 100644 --- a/src/database/database.hpp +++ b/src/database/database.hpp @@ -75,15 +75,19 @@ class Database { Database() = default; // The constructor with a user-provided database overlay (potentially an empty vector) - explicit Database(const Device &device, const std::vector<std::string> &routines, + explicit Database(const Device &device, const std::string &kernel_name, const Precision precision, const std::vector<const DatabaseEntry*> &overlay); // Accessor of values by key - size_t operator[](const std::string key) const { return parameters_->find(key)->second; } + size_t operator[](const std::string &key) const { return parameters_->find(key)->second; } + bool exists(const std::string &key) const { return (parameters_->count(key) == 1); } // Obtain a list of OpenCL pre-processor defines based on the parameters std::string GetDefines() const; + // Retrieves the names of all the parameters + std::vector<std::string> GetParameterNames() const; + private: // Search method for a specified database, returning pointer (possibly a nullptr) ParametersPtr Search(const std::string &this_kernel, const std::string &this_type, @@ -96,6 +100,31 @@ class Database { }; // ================================================================================================= + +// Multiple databases together in a map +class Databases { + public: + + explicit Databases(const std::vector<std::string> &kernel_names): kernel_names_(kernel_names) { } + + // Database accessor + Database& operator()(const std::string &kernel_name) { return databases_[kernel_name]; } + + // Retrieves a parameter from the database + size_t operator[](const std::string &key) const { + for (const auto &kernel_name : kernel_names_) { + const auto &kernel_db = databases_.find(kernel_name)->second; + if (kernel_db.exists(key)) { return kernel_db[key]; } + } + throw RuntimeErrorCode(StatusCode::kDatabaseError); + } + + private: + const std::vector<std::string> kernel_names_; + std::unordered_map<std::string, Database> databases_; +}; + +// ================================================================================================= } // namespace clblast // CLBLAST_DATABASE_H_ |