diff options
author | Cedric Nugteren <web@cedricnugteren.nl> | 2017-02-12 12:02:39 +0100 |
---|---|---|
committer | Cedric Nugteren <web@cedricnugteren.nl> | 2017-02-12 12:02:39 +0100 |
commit | 345a5feb9a18641ceffd7ce5e0cb9387686cf32c (patch) | |
tree | cdae4f7fd42f4b23349867243434a1d648ed3e41 /src/database/database.hpp | |
parent | faa842b927ede6df1763607e3732151162875d73 (diff) |
Split the database into several smaller cached per-kernel databases (in preparation of per-kernel database overrides)
Diffstat (limited to 'src/database/database.hpp')
-rw-r--r-- | src/database/database.hpp | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/src/database/database.hpp b/src/database/database.hpp index 87c12293..b6760ec3 100644 --- a/src/database/database.hpp +++ b/src/database/database.hpp @@ -75,11 +75,12 @@ 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; @@ -96,6 +97,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_ |