// ================================================================================================= // This file is part of the CLBlast project. The project is licensed under Apache Version 2.0. This // project loosely follows the Google C++ styleguide and uses a tab-size of two spaces and a max- // width of 100 characters per line. // // Author(s): // Cedric Nugteren // // This file uses the auto-tuner to tune the xgemm OpenCL kernels. // // ================================================================================================= #include "tuning/kernels/xgemm.hpp" // Shortcuts to the clblast namespace using half = clblast::half; using float2 = clblast::float2; using double2 = clblast::double2; // Function to tune a specific variation V (not within the clblast namespace) template void StartVariation(int argc, char *argv[]) { const auto command_line_args = clblast::RetrieveCommandLineArguments(argc, argv); switch(clblast::GetPrecision(command_line_args)) { case clblast::Precision::kHalf: clblast::Tuner(argc, argv, V, clblast::XgemmGetTunerDefaults, clblast::XgemmGetTunerSettings, clblast::XgemmTestValidArguments, clblast::XgemmSetConstraints, clblast::XgemmComputeLocalMemSize, clblast::XgemmSetArguments); break; case clblast::Precision::kSingle: clblast::Tuner(argc, argv, V, clblast::XgemmGetTunerDefaults, clblast::XgemmGetTunerSettings, clblast::XgemmTestValidArguments, clblast::XgemmSetConstraints, clblast::XgemmComputeLocalMemSize, clblast::XgemmSetArguments); break; case clblast::Precision::kDouble: clblast::Tuner(argc, argv, V, clblast::XgemmGetTunerDefaults, clblast::XgemmGetTunerSettings, clblast::XgemmTestValidArguments, clblast::XgemmSetConstraints, clblast::XgemmComputeLocalMemSize, clblast::XgemmSetArguments); break; case clblast::Precision::kComplexSingle: clblast::Tuner(argc, argv, V, clblast::XgemmGetTunerDefaults, clblast::XgemmGetTunerSettings, clblast::XgemmTestValidArguments, clblast::XgemmSetConstraints, clblast::XgemmComputeLocalMemSize, clblast::XgemmSetArguments); break; case clblast::Precision::kComplexDouble: clblast::Tuner(argc, argv, V, clblast::XgemmGetTunerDefaults, clblast::XgemmGetTunerSettings, clblast::XgemmTestValidArguments, clblast::XgemmSetConstraints, clblast::XgemmComputeLocalMemSize, clblast::XgemmSetArguments); break; } } // Main function (not within the clblast namespace) int main(int argc, char *argv[]) { try { printf("* (1/4) Tuning main GEMM kernel (GEMMK == 0) for fixed set of parameters\n\n"); StartVariation<1>(argc, argv); printf("* (2/4) Tuning main GEMM kernel (GEMMK == 0) for random parameters out of larger set\n\n"); StartVariation<2>(argc, argv); printf("* (3/4) Tuning secondary GEMM kernel (GEMMK == 1) for fixed set of parameters\n\n"); StartVariation<11>(argc, argv); printf("* (4/4) Tuning secondary GEMM kernel (GEMMK == 1) for random parameters out of larger set\n\n"); StartVariation<12>(argc, argv); return 0; } catch (...) { return static_cast(clblast::DispatchException()); } } // =================================================================================================