From 8131e68664e02c8a1bc5a0f5598294fd3bc5b974 Mon Sep 17 00:00:00 2001 From: mcian Date: Mon, 17 Jul 2017 12:00:25 +0200 Subject: Add PSO parameters support and search strategy selection from command line --- src/tuning/kernels/xgemm.cpp | 51 +++++++++++++++++++++++++++++++++++++++++--- src/tuning/tuning.hpp | 44 ++++++++++++++++++++++++++++++++++++-- src/utilities/utilities.hpp | 43 +++++++++++++++++++++++++++++++------ 3 files changed, 126 insertions(+), 12 deletions(-) diff --git a/src/tuning/kernels/xgemm.cpp b/src/tuning/kernels/xgemm.cpp index 9b4cea8b..6ab64af4 100644 --- a/src/tuning/kernels/xgemm.cpp +++ b/src/tuning/kernels/xgemm.cpp @@ -18,6 +18,9 @@ #include "utilities/utilities.hpp" #include "tuning/tuning.hpp" +#define XGEMM_EXEC +bool tStrategyFlag=true; +#define DEFAULT_NUM_OF_STRATEGY 1 namespace clblast { // ================================================================================================= @@ -28,7 +31,8 @@ class TuneXgemm { public: // The representative kernel and the source code - static std::string KernelFamily() { return (V==1) ? "xgemm_1" : "xgemm_2"; } + // static std::string KernelFamily() { return (V==1) ? "xgemm_1" : "xgemm_2"; } + static std::string KernelFamily() { switch(V){ case 1: return "xgemm_1"; case 2: case 3:return "xgemm_2"; }} static std::string KernelName() { return "Xgemm"; } static std::string GetSources() { return @@ -41,7 +45,7 @@ class TuneXgemm { // The list of arguments relevant for this routine static std::vector GetOptions() { - return {kArgM, kArgN, kArgK, kArgAlpha, kArgBeta, kArgFraction}; + return {kArgM, kArgN, kArgK, kArgAlpha, kArgBeta, kArgFraction,tStrategy, psoSwarmSize, psoInfG, psoInfL, psoInfR}; } // Tests for valid arguments @@ -82,6 +86,7 @@ class TuneXgemm { tuner.AddParameter(id, "SB", {0, 1}); } // a lot more tuning parameters - has to be sampled randomly, too much to test all else { + //RANDOM_SEARCH & PSO tuner.AddParameter(id, "MWG", {16, 32, 64, 128}); tuner.AddParameter(id, "NWG", {16, 32, 64, 128}); tuner.AddParameter(id, "KWG", {16, 32}); @@ -97,6 +102,7 @@ class TuneXgemm { tuner.AddParameter(id, "SA", {0, 1}); tuner.AddParameter(id, "SB", {0, 1}); } + } // Sets the constraints @@ -190,10 +196,49 @@ void StartVariation(int argc, char *argv[]) { } } + // Main function (not within the clblast namespace) int main(int argc, char *argv[]) { + +int num_of_strategies = DEFAULT_NUM_OF_STRATEGY; + +if(const char* env_p = std::getenv("CK_TUNER_NUM_OF_STRATEGIES")) +{ + num_of_strategies = atoi(env_p); + printf("CK_TUNER_NUM_OF_STRATEGIES is: %s\n", env_p ); +} +else +{ + printf("CK_TUNER_NUM_OF_STRATEGIES is not defined\n"); +} + +printf("num_of_strategies : %d\n",num_of_strategies ); + +if( DEFAULT_NUM_OF_STRATEGY != num_of_strategies ) +{ + //FACCIO PRIMA LA FULL SEARCH StartVariation<1>(argc, argv); - StartVariation<2>(argc, argv); +} + + auto command_line_args = clblast::RetrieveCommandLineArguments(argc, argv); + auto help = std::string{"* Options given/available:\n"}; + auto localtStrategy = clblast::GetArgument(command_line_args, help, clblast::tStrategy, DEFAULT_STRATEGY); + switch(localtStrategy) + { + case FULL_SEARCH_STRATEGY: + StartVariation<1>(argc, argv); + break; + case RANDOM_SEARCH_STRATEGY: + StartVariation<2>(argc, argv); + break; + case PSO_STRATEGY: + StartVariation<3>(argc, argv); + break; + case DVDT_STRATEGY: + StartVariation<2>(argc, argv); + break; + } + return 0; } diff --git a/src/tuning/tuning.hpp b/src/tuning/tuning.hpp index 25504430..35b320cb 100644 --- a/src/tuning/tuning.hpp +++ b/src/tuning/tuning.hpp @@ -48,6 +48,11 @@ void Tuner(int argc, char* argv[]) { if (o == kArgBeta) { args.beta = GetArgument(command_line_args, help, kArgBeta, GetScalar()); } if (o == kArgFraction) { args.fraction = GetArgument(command_line_args, help, kArgFraction, C::DefaultFraction()); } if (o == kArgBatchCount) { args.batch_count = GetArgument(command_line_args, help, kArgBatchCount, C::DefaultBatchCount()); } + if (o == tStrategy) {args.tStrategy = GetArgument(command_line_args, help, tStrategy, DEFAULT_STRATEGY); } + if (o == psoSwarmSize) {args.psoSwarmSize = GetArgument(command_line_args, help, psoSwarmSize, DEFAULT_PSO_SWARM); } + if (o == psoInfG) {args.psoInfG = GetArgument(command_line_args, help, psoInfG, DEFAULT_PSO_G); } + if (o == psoInfL) {args.psoInfL = GetArgument(command_line_args, help, psoInfL, DEFAULT_PSO_L); } + if (o == psoInfR) {args.psoInfR = GetArgument(command_line_args, help, psoInfR, DEFAULT_PSO_R); } } const auto num_runs = GetArgument(command_line_args, help, kArgNumRuns, C::DefaultNumRuns()); @@ -93,13 +98,46 @@ void Tuner(int argc, char* argv[]) { // Use full-search to explore all parameter combinations or random-search to search only a part of // the parameter values. The fraction is set as a command-line argument. - if (args.fraction == 1.0 || args.fraction == 0.0) { + #ifdef XGEMM_EXEC + + if(tStrategyFlag) + { + auto localtStrategy = args.tStrategy; + + if (args.fraction == 1.0 || args.fraction == 0.0) + { + localtStrategy = FULL_SEARCH_STRATEGY; + } + switch (localtStrategy) + { + case FULL_SEARCH_STRATEGY: + tuner.UseFullSearch(); + break; + + case RANDOM_SEARCH_STRATEGY: + tuner.UseRandomSearch(1.0/args.fraction); + break; + case PSO_STRATEGY: + tuner.UsePSO(1.0/args.fraction, args.psoSwarmSize, args.psoInfG, args.psoInfL, args.psoInfR); + break; + case DVDT_STRATEGY: + default: + tuner.UseFullSearch(); + } + } + + #else + + if (args.fraction == 1.0 || args.fraction == 0.0) + { tuner.UseFullSearch(); } - else { + else + { tuner.UseRandomSearch(1.0/args.fraction); } + #endif // Set extra settings for specific defines. This mimics src/routine.cc. auto defines = std::string{""}; if (isAMD && isGPU) { @@ -162,6 +200,8 @@ void Tuner(int argc, char* argv[]) { if (o == kArgBatchCount) { metadata.push_back({"arg_batch_count", ToString(args.batch_count)}); } } tuner.PrintJSON("clblast_"+C::KernelFamily()+"_"+precision_string+".json", metadata); + + } // ================================================================================================= diff --git a/src/utilities/utilities.hpp b/src/utilities/utilities.hpp index 03051354..54214c49 100644 --- a/src/utilities/utilities.hpp +++ b/src/utilities/utilities.hpp @@ -28,6 +28,21 @@ #include "utilities/clblast_exceptions.hpp" #include "utilities/msvc.hpp" +#define FULL_SEARCH_STRATEGY 0 +#define RANDOM_SEARCH_STRATEGY 1 +#define PSO_STRATEGY 2 +#define DVDT_STRATEGY 3 + +#define DEFAULT_STRATEGY 0 + +#define DEFAULT_PSO_SWARM 8 +#define DEFAULT_PSO_G 0.3 +#define DEFAULT_PSO_L 0.6 +#define DEFAULT_PSO_R 0.1 + +#ifdef XGEMM_EXEC +extern bool tStrategyFlag; +#endif namespace clblast { // ================================================================================================= @@ -47,6 +62,12 @@ constexpr auto kUnknownError = -999; // ================================================================================================= +constexpr auto tStrategy = "strategy"; +constexpr auto psoSwarmSize = "psoSwarmSize"; +constexpr auto psoInfG = "psoInfG"; +constexpr auto psoInfL = "psoInfL"; +constexpr auto psoInfR = "psoInfR"; + // The routine-specific arguments in string form constexpr auto kArgM = "m"; constexpr auto kArgN = "n"; @@ -172,13 +193,13 @@ struct Arguments { T beta = ConstantOne(); // Batch-specific arguments size_t batch_count = 1; - std::vector x_offsets; // = {0}; - std::vector y_offsets; // = {0}; - std::vector a_offsets; // = {0}; - std::vector b_offsets; // = {0}; - std::vector c_offsets; // = {0}; - std::vector alphas; // = {ConstantOne()}; - std::vector betas; // = {ConstantOne()}; + std::vector x_offsets = {0}; + std::vector y_offsets = {0}; + std::vector a_offsets = {0}; + std::vector b_offsets = {0}; + std::vector c_offsets = {0}; + std::vector alphas = {ConstantOne()}; + std::vector betas = {ConstantOne()}; // Sizes size_t x_size = 1; size_t y_size = 1; @@ -206,8 +227,16 @@ struct Arguments { bool print_help = false; bool silent = false; bool no_abbrv = false; + + int tStrategy = DEFAULT_STRATEGY; + size_t psoSwarmSize = DEFAULT_PSO_SWARM; + double psoInfG = DEFAULT_PSO_G; + double psoInfL = DEFAULT_PSO_L; + double psoInfR = DEFAULT_PSO_R; }; + + // Structure containing all possible buffers for test clients template struct Buffers { -- cgit v1.2.3