diff options
author | Cedric Nugteren <web@cedricnugteren.nl> | 2017-02-26 14:51:45 +0100 |
---|---|---|
committer | Cedric Nugteren <web@cedricnugteren.nl> | 2017-02-26 14:51:45 +0100 |
commit | ea6790665d228e9ff9ba39983a60cd91611ee1fe (patch) | |
tree | 043ca277a867507f97f804cc4057fe50e548b9b1 /src/clblast.cpp | |
parent | a145890aaac0087d36b414bd59c247ae4b70b3e5 (diff) | |
parent | 0643a29af51f9eb13e2b276d0a0e74590c699d3b (diff) |
Merge branch 'development' into triangular_solvers
Diffstat (limited to 'src/clblast.cpp')
-rw-r--r-- | src/clblast.cpp | 43 |
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> ¶meters) { + 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 ¤t_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 |