summaryrefslogtreecommitdiff
path: root/src/database/database.hpp
diff options
context:
space:
mode:
authorCedric Nugteren <web@cedricnugteren.nl>2017-02-12 12:02:39 +0100
committerCedric Nugteren <web@cedricnugteren.nl>2017-02-12 12:02:39 +0100
commit345a5feb9a18641ceffd7ce5e0cb9387686cf32c (patch)
treecdae4f7fd42f4b23349867243434a1d648ed3e41 /src/database/database.hpp
parentfaa842b927ede6df1763607e3732151162875d73 (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.hpp30
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_