summaryrefslogtreecommitdiff
path: root/src/clblast.cpp
diff options
context:
space:
mode:
authorCedric Nugteren <web@cedricnugteren.nl>2017-02-26 14:51:45 +0100
committerCedric Nugteren <web@cedricnugteren.nl>2017-02-26 14:51:45 +0100
commitea6790665d228e9ff9ba39983a60cd91611ee1fe (patch)
tree043ca277a867507f97f804cc4057fe50e548b9b1 /src/clblast.cpp
parenta145890aaac0087d36b414bd59c247ae4b70b3e5 (diff)
parent0643a29af51f9eb13e2b276d0a0e74590c699d3b (diff)
Merge branch 'development' into triangular_solvers
Diffstat (limited to 'src/clblast.cpp')
-rw-r--r--src/clblast.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/clblast.cpp b/src/clblast.cpp
index 48bec54d..a63d766c 100644
--- a/src/clblast.cpp
+++ b/src/clblast.cpp
@@ -2266,4 +2266,47 @@ StatusCode FillCache(const cl_device_id device) {
}
// =================================================================================================
+
+// Overrides the tuning parameters for this device-precision-kernel combination
+StatusCode OverrideParameters(const cl_device_id device, const std::string &kernel_name,
+ const Precision precision,
+ const std::unordered_map<std::string,size_t> &parameters) {
+ try {
+
+ // Retrieves the device name
+ const auto device_cpp = Device(device);
+ const auto device_name = device_cpp.Name();
+
+ // Retrieves the current database values to verify whether the new ones are complete
+ auto in_cache = false;
+ const auto current_database = DatabaseCache::Instance().Get(DatabaseKeyRef{ precision, device_name, kernel_name }, &in_cache);
+ if (!in_cache) { return StatusCode::kInvalidOverrideKernel; }
+ for (const auto &current_param : current_database.GetParameterNames()) {
+ if (parameters.find(current_param) == parameters.end()) {
+ return StatusCode::kMissingOverrideParameter;
+ }
+ }
+
+ // Clears the existing program & binary cache for routines with the target kernel
+ const auto routine_names = Routine::routines_by_kernel.at(kernel_name);
+ for (const auto &routine_name : routine_names) {
+ ProgramCache::Instance().RemoveBySubset<1, 2>(ProgramKey{nullptr, precision, routine_name});
+ BinaryCache::Instance().Remove(BinaryKey{precision, routine_name, device_name});
+ }
+
+ // Creates a small custom database based on the provided parameters
+ const auto database_device = Database::DatabaseDevice{"default", parameters};
+ const auto database_vendor = Database::DatabaseVendor{database::kDeviceTypeAll, "default", {database_device}};
+ const auto database_entry = Database::DatabaseEntry{kernel_name, precision, {database_vendor}};
+ const auto database = Database(device_cpp, kernel_name, precision, {&database_entry});
+
+ // Removes the old database entry and stores the new one in the cache
+ DatabaseCache::Instance().Remove(DatabaseKey{ precision, device_name, kernel_name });
+ DatabaseCache::Instance().Store(DatabaseKey{ precision, device_name, kernel_name }, Database(database));
+
+ } catch (...) { return DispatchException(); }
+ return StatusCode::kSuccess;
+}
+
+// =================================================================================================
} // namespace clblast