From 7f14b11f1e240f12f5f6bf93cbbeab26001e9a5c Mon Sep 17 00:00:00 2001 From: Cedric Nugteren Date: Sun, 5 Mar 2017 11:13:47 +0100 Subject: [PATCH] Changed the way the test-data is generated: now using a single MT generator and distribution for all data --- src/tuning/tuning.hpp | 15 +++++--- src/utilities/utilities.cpp | 37 ++++++------------- src/utilities/utilities.hpp | 3 +- test/correctness/misc/override_parameters.cpp | 15 +++++--- test/correctness/testblas.cpp | 18 +++++---- test/performance/client.cpp | 22 ++++++----- test/routines/levelx/xinvert.hpp | 2 +- 7 files changed, 58 insertions(+), 54 deletions(-) diff --git a/src/tuning/tuning.hpp b/src/tuning/tuning.hpp index 1dd76894..7060fc9f 100644 --- a/src/tuning/tuning.hpp +++ b/src/tuning/tuning.hpp @@ -17,6 +17,7 @@ #include #include +#include #include @@ -77,12 +78,14 @@ void Tuner(int argc, char* argv[]) { auto b_mat = std::vector(C::GetSizeB(args)); auto c_mat = std::vector(C::GetSizeC(args)); auto temp = std::vector(C::GetSizeTemp(args)); - PopulateVector(x_vec, kSeed); - PopulateVector(y_vec, kSeed); - PopulateVector(a_mat, kSeed); - PopulateVector(b_mat, kSeed); - PopulateVector(c_mat, kSeed); - PopulateVector(temp, kSeed); + std::mt19937 mt(kSeed); + std::uniform_real_distribution dist(kTestDataLowerLimit, kTestDataUpperLimit); + PopulateVector(x_vec, mt, dist); + PopulateVector(y_vec, mt, dist); + PopulateVector(a_mat, mt, dist); + PopulateVector(b_mat, mt, dist); + PopulateVector(c_mat, mt, dist); + PopulateVector(temp, mt, dist); // Initializes the tuner for the chosen device cltune::Tuner tuner(args.platform_id, args.device_id); diff --git a/src/utilities/utilities.cpp b/src/utilities/utilities.cpp index d68cc1a6..89265bd6 100644 --- a/src/utilities/utilities.cpp +++ b/src/utilities/utilities.cpp @@ -326,42 +326,29 @@ unsigned int GetRandomSeed() { // Create a random number generator and populates a vector with samples from a random distribution template -void PopulateVector(std::vector &vector, const unsigned int seed) { - auto lower_limit = static_cast(kTestDataLowerLimit); - auto upper_limit = static_cast(kTestDataUpperLimit); - std::mt19937 mt(seed); - std::uniform_real_distribution dist(lower_limit, upper_limit); - for (auto &element: vector) { element = dist(mt); } +void PopulateVector(std::vector &vector, std::mt19937 &mt, std::uniform_real_distribution &dist) { + for (auto &element: vector) { element = static_cast(dist(mt)); } } -template void PopulateVector(std::vector&, const unsigned int); -template void PopulateVector(std::vector&, const unsigned int); +template void PopulateVector(std::vector&, std::mt19937&, std::uniform_real_distribution&); +template void PopulateVector(std::vector&, std::mt19937&, std::uniform_real_distribution&); // Specialized versions of the above for complex data-types template <> -void PopulateVector(std::vector &vector, const unsigned int seed) { - auto lower_limit = static_cast(kTestDataLowerLimit); - auto upper_limit = static_cast(kTestDataUpperLimit); - std::mt19937 mt(seed); - std::uniform_real_distribution dist(lower_limit, upper_limit); - for (auto &element: vector) { element.real(dist(mt)); element.imag(dist(mt)); } +void PopulateVector(std::vector &vector, std::mt19937 &mt, std::uniform_real_distribution &dist) { + for (auto &element: vector) { + element.real(static_cast(dist(mt))); + element.imag(static_cast(dist(mt))); + } } template <> -void PopulateVector(std::vector &vector, const unsigned int seed) { - auto lower_limit = static_cast(kTestDataLowerLimit); - auto upper_limit = static_cast(kTestDataUpperLimit); - std::mt19937 mt(seed); - std::uniform_real_distribution dist(lower_limit, upper_limit); +void PopulateVector(std::vector &vector, std::mt19937 &mt, std::uniform_real_distribution &dist) { for (auto &element: vector) { element.real(dist(mt)); element.imag(dist(mt)); } } // Specialized versions of the above for half-precision template <> -void PopulateVector(std::vector &vector, const unsigned int seed) { - const auto lower_limit = static_cast(kTestDataLowerLimit); - const auto upper_limit = static_cast(kTestDataUpperLimit); - std::mt19937 mt(seed); - std::uniform_real_distribution dist(lower_limit, upper_limit); - for (auto &element: vector) { element = FloatToHalf(dist(mt)); } +void PopulateVector(std::vector &vector, std::mt19937 &mt, std::uniform_real_distribution &dist) { + for (auto &element: vector) { element = FloatToHalf(static_cast(dist(mt))); } } // ================================================================================================= diff --git a/src/utilities/utilities.hpp b/src/utilities/utilities.hpp index 3c9be6a2..330db597 100644 --- a/src/utilities/utilities.hpp +++ b/src/utilities/utilities.hpp @@ -20,6 +20,7 @@ #include #include #include +#include #include "clpp11.hpp" #include "clblast.h" @@ -234,7 +235,7 @@ constexpr auto kTestDataUpperLimit = 2.0; // Populates a vector with random data template -void PopulateVector(std::vector &vector, const unsigned int seed); +void PopulateVector(std::vector &vector, std::mt19937 &mt, std::uniform_real_distribution &dist); // ================================================================================================= diff --git a/test/correctness/misc/override_parameters.cpp b/test/correctness/misc/override_parameters.cpp index a4cecf0d..e6eebef7 100644 --- a/test/correctness/misc/override_parameters.cpp +++ b/test/correctness/misc/override_parameters.cpp @@ -11,11 +11,14 @@ // // ================================================================================================= +#include +#include +#include +#include + #include "utilities/utilities.hpp" #include "test/routines/level3/xgemm.hpp" -#include - namespace clblast { // ================================================================================================= @@ -71,9 +74,11 @@ size_t RunOverrideTests(int argc, char *argv[], const bool silent, const std::st auto host_a = std::vector(args.m * args.k); auto host_b = std::vector(args.n * args.k); auto host_c = std::vector(args.m * args.n); - PopulateVector(host_a, kSeed); - PopulateVector(host_b, kSeed); - PopulateVector(host_c, kSeed); + std::mt19937 mt(kSeed); + std::uniform_real_distribution dist(kTestDataLowerLimit, kTestDataUpperLimit); + PopulateVector(host_a, mt, dist); + PopulateVector(host_b, mt, dist); + PopulateVector(host_c, mt, dist); // Copy the matrices to the device auto device_a = Buffer(context, host_a.size()); diff --git a/test/correctness/testblas.cpp b/test/correctness/testblas.cpp index d959ce18..505b3b36 100644 --- a/test/correctness/testblas.cpp +++ b/test/correctness/testblas.cpp @@ -13,7 +13,9 @@ #include #include +#include +#include "utilities/utilities.hpp" #include "test/correctness/testblas.hpp" namespace clblast { @@ -88,13 +90,15 @@ TestBlas::TestBlas(const std::vector &arguments, const bool si c_source_.resize(std::max(max_mat, max_matvec)*std::max(max_ld, max_matvec) + max_offset); ap_source_.resize(std::max(max_mat, max_matvec)*std::max(max_mat, max_matvec) + max_offset); scalar_source_.resize(std::max(max_mat, max_matvec) + max_offset); - PopulateVector(x_source_, kSeed); - PopulateVector(y_source_, kSeed); - PopulateVector(a_source_, kSeed); - PopulateVector(b_source_, kSeed); - PopulateVector(c_source_, kSeed); - PopulateVector(ap_source_, kSeed); - PopulateVector(scalar_source_, kSeed); + std::mt19937 mt(kSeed); + std::uniform_real_distribution dist(kTestDataLowerLimit, kTestDataUpperLimit); + PopulateVector(x_source_, mt, dist); + PopulateVector(y_source_, mt, dist); + PopulateVector(a_source_, mt, dist); + PopulateVector(b_source_, mt, dist); + PopulateVector(c_source_, mt, dist); + PopulateVector(ap_source_, mt, dist); + PopulateVector(scalar_source_, mt, dist); } // =============================================================================================== diff --git a/test/performance/client.cpp b/test/performance/client.cpp index 2c45b35e..16b44b5a 100644 --- a/test/performance/client.cpp +++ b/test/performance/client.cpp @@ -11,13 +11,15 @@ // // ================================================================================================= -#include "test/performance/client.hpp" - #include #include #include #include #include +#include + +#include "utilities/utilities.hpp" +#include "test/performance/client.hpp" namespace clblast { // ================================================================================================= @@ -179,13 +181,15 @@ void Client::PerformanceTest(Arguments &args, const SetMetric set_sizes) std::vector c_source(args.c_size); std::vector ap_source(args.ap_size); std::vector scalar_source(args.scalar_size); - PopulateVector(x_source, kSeed); - PopulateVector(y_source, kSeed); - PopulateVector(a_source, kSeed); - PopulateVector(b_source, kSeed); - PopulateVector(c_source, kSeed); - PopulateVector(ap_source, kSeed); - PopulateVector(scalar_source, kSeed); + std::mt19937 mt(kSeed); + std::uniform_real_distribution dist(kTestDataLowerLimit, kTestDataUpperLimit); + PopulateVector(x_source, mt, dist); + PopulateVector(y_source, mt, dist); + PopulateVector(a_source, mt, dist); + PopulateVector(b_source, mt, dist); + PopulateVector(c_source, mt, dist); + PopulateVector(ap_source, mt, dist); + PopulateVector(scalar_source, mt, dist); // Creates the matrices on the device auto x_vec = Buffer(context, args.x_size); diff --git a/test/routines/levelx/xinvert.hpp b/test/routines/levelx/xinvert.hpp index 05bea9aa..b470dbf3 100644 --- a/test/routines/levelx/xinvert.hpp +++ b/test/routines/levelx/xinvert.hpp @@ -19,7 +19,7 @@ #include #include -#include "routines/levelx/xinvert.hpp" +#include "utilities/utilities.hpp" namespace clblast { // =================================================================================================