summaryrefslogtreecommitdiff
path: root/test/test_utilities.cpp
diff options
context:
space:
mode:
authorCedric Nugteren <web@cedricnugteren.nl>2017-11-22 20:53:20 +0100
committerCedric Nugteren <web@cedricnugteren.nl>2017-11-22 20:53:20 +0100
commit9527c89c3087b4c92bd988340c3b25c1c5e70d8f (patch)
tree9bc6963f4050461f405d7da48b4f632eb5346137 /test/test_utilities.cpp
parent8c9ecd97366980200a58a4b8cd77bd7f8b859abc (diff)
Made parameter override in the clients a command-line argument and added support for multi-kernel routines
Diffstat (limited to 'test/test_utilities.cpp')
-rw-r--r--test/test_utilities.cpp74
1 files changed, 51 insertions, 23 deletions
diff --git a/test/test_utilities.cpp b/test/test_utilities.cpp
index b7aef0a0..fb85e4a2 100644
--- a/test/test_utilities.cpp
+++ b/test/test_utilities.cpp
@@ -14,6 +14,7 @@
#include <string>
#include <vector>
#include <cctype>
+#include <algorithm>
#include "test/test_utilities.hpp"
@@ -115,22 +116,46 @@ void FloatToHalfBuffer(std::vector<half>& result, const std::vector<float>& sour
// =================================================================================================
-void OverrideParametersFromJSONFiles(const cl_device_id device, const Precision precision) {
- const auto json_file_name = std::getenv("CLBLAST_JSON_FILE_OVERRIDE");
- if (json_file_name == nullptr) { return; }
- const auto json_file_name_string = std::string{json_file_name};
- OverrideParametersFromJSONFile(json_file_name_string, device, precision);
+void OverrideParametersFromJSONFiles(const std::vector<std::string>& file_names,
+ const cl_device_id device, const Precision precision) {
+
+ // Retrieves the best parameters for each file from disk
+ BestParametersCollection all_parameters = {};
+ for (const auto json_file_name : file_names) {
+ GetBestParametersFromJSONFile(json_file_name, all_parameters);
+ }
+
+ // Applies the parameter override
+ for (const auto &best_parameters : all_parameters) {
+ const auto kernel_family = best_parameters.first;
+ const auto parameters = best_parameters.second;
+ const auto status = OverrideParameters(device, kernel_family, precision, parameters);
+ if (status == StatusCode::kSuccess) {
+ fprintf(stdout, "* Applying parameter override successfully for '%s'\n",
+ kernel_family.c_str());
+ } else {
+ fprintf(stdout, "* Error while applying parameter override for '%s'\n",
+ kernel_family.c_str());
+ }
+ }
+
+ if (file_names.size() > 0) {
+ fprintf(stdout, "\n");
+ }
}
-void OverrideParametersFromJSONFile(const std::string& file_name,
- const cl_device_id device, const Precision precision) {
+void GetBestParametersFromJSONFile(const std::string& file_name,
+ BestParametersCollection& all_parameters) {
std::ifstream json_file(file_name);
- if (!json_file) { return; }
+ if (!json_file) {
+ fprintf(stdout, "* Could not open file '%s'\n", file_name.c_str());
+ return;
+ }
fprintf(stdout, "* Reading override-parameters from '%s'\n", file_name.c_str());
std::string line;
- auto kernel_name = std::string{};
+ auto kernel_family = std::string{};
while (std::getline(json_file, line)) {
const auto line_split = split(line, ':');
if (line_split.size() != 2) { continue; }
@@ -139,20 +164,29 @@ void OverrideParametersFromJSONFile(const std::string& file_name,
if (line_split[0] == " \"kernel_family\"") {
const auto value_split = split(line_split[1], '\"');
if (value_split.size() != 3) { break; }
- kernel_name = value_split[1];
- kernel_name[0] = toupper(kernel_name[0]); // because of a tuner - database naming mismatch
+ kernel_family = value_split[1];
+ kernel_family[0] = toupper(kernel_family[0]); // because of a tuner - database naming mismatch
+ kernel_family.erase(std::remove(kernel_family.begin(), kernel_family.end(), '_'), kernel_family.end());
+ kernel_family.erase(std::remove(kernel_family.begin(), kernel_family.end(), '1'), kernel_family.end());
+ kernel_family.erase(std::remove(kernel_family.begin(), kernel_family.end(), '2'), kernel_family.end());
+ kernel_family.erase(std::remove(kernel_family.begin(), kernel_family.end(), '3'), kernel_family.end());
}
// Retrieves the best-parameters and sets the override
- if (line_split[0] == " \"best_parameters\"" && kernel_name != "") {
+ if (line_split[0] == " \"best_parameters\"" && kernel_family != std::string{""}) {
const auto value_split = split(line_split[1], '\"');
if (value_split.size() != 3) { break; }
const auto config_split = split(value_split[1], ' ');
if (config_split.size() == 0) { break; }
+ // Loads an existing list of parameters for this kernel family (if present)
+ BestParameters parameters;
+ if (all_parameters.count(kernel_family) == 1) {
+ parameters = all_parameters.at(kernel_family);
+ }
+
// Creates the list of parameters
- fprintf(stdout, "* Found parameters for kernel '%s': { ", kernel_name.c_str());
- std::unordered_map<std::string,size_t> parameters;
+ fprintf(stdout, "* Found parameters for kernel '%s': { ", kernel_family.c_str());
for (const auto config : config_split) {
const auto params_split = split(config, '=');
if (params_split.size() != 2) { break; }
@@ -165,21 +199,15 @@ void OverrideParametersFromJSONFile(const std::string& file_name,
}
fprintf(stdout, "}\n");
- // Applies the parameter override
- const auto status = OverrideParameters(device, kernel_name, precision, parameters);
- if (status != StatusCode::kSuccess) { break; }
-
- // Ends this function (success)
- fprintf(stdout, "* Applying parameter override successfully\n");
- fprintf(stdout, "\n");
+ // Sets the new (possibly extended) parameter map as the final result
+ all_parameters[kernel_family] = parameters;
json_file.close();
return;
}
}
// Ends this function (failure)
- fprintf(stdout, "* Failed to extract parameters from the file, continuing regularly\n");
- fprintf(stdout, "\n");
+ fprintf(stdout, "* Failed to extract parameters from this file, continuing\n");
json_file.close();
}