diff --git a/benchmark/benchmark_utils.hpp b/benchmark/benchmark_utils.hpp index 81761bf9..ca5f31b1 100644 --- a/benchmark/benchmark_utils.hpp +++ b/benchmark/benchmark_utils.hpp @@ -43,11 +43,12 @@ namespace benchmark_utils { +const size_t default_max_random_size = 1024 * 1024; // get_random_data() generates only part of sequence and replicates it, // because benchmarks usually do not need "true" random sequence. template -inline auto get_random_data(size_t size, T min, T max, size_t max_random_size = 1024 * 1024) +inline auto get_random_data(size_t size, T min, T max, size_t max_random_size = default_max_random_size) -> typename std::enable_if::value, std::vector>::type { std::random_device rd; @@ -66,7 +67,7 @@ inline auto get_random_data(size_t size, T min, T max, size_t max_random_size = } template -inline auto get_random_data(size_t size, T min, T max, size_t max_random_size = 1024 * 1024) +inline auto get_random_data(size_t size, T min, T max, size_t max_random_size = default_max_random_size) -> typename std::enable_if::value, std::vector>::type { std::random_device rd; @@ -84,8 +85,66 @@ inline auto get_random_data(size_t size, T min, T max, size_t max_random_size = return data; } +#if defined(_WIN32) && defined(__clang__) +// get_random_data() generates only part of sequence and replicates it, +// because benchmarks usually do not need "true" random sequence. +template<> +inline std::vector get_random_data(size_t size, unsigned char min, unsigned char max, size_t max_random_size) +{ + std::random_device rd; + std::default_random_engine gen(rd()); + std::uniform_int_distribution distribution(min, max); + std::vector data(size); + std::generate( + data.begin(), data.begin() + std::min(size, max_random_size), + [&]() { return distribution(gen); } + ); + for(size_t i = max_random_size; i < size; i += max_random_size) + { + std::copy_n(data.begin(), std::min(size - i, max_random_size), data.begin() + i); + } + return data; +} + +template<> +inline std::vector get_random_data(size_t size, signed char min, signed char max, size_t max_random_size) +{ + std::random_device rd; + std::default_random_engine gen(rd()); + std::uniform_int_distribution distribution(min, max); + std::vector data(size); + std::generate( + data.begin(), data.begin() + std::min(size, max_random_size), + [&]() { return distribution(gen); } + ); + for(size_t i = max_random_size; i < size; i += max_random_size) + { + std::copy_n(data.begin(), std::min(size - i, max_random_size), data.begin() + i); + } + return data; +} + +template<> +inline std::vector get_random_data(size_t size, char min, char max, size_t max_random_size) +{ + std::random_device rd; + std::default_random_engine gen(rd()); + std::uniform_int_distribution distribution(min, max); + std::vector data(size); + std::generate( + data.begin(), data.begin() + std::min(size, max_random_size), + [&]() { return distribution(gen); } + ); + for(size_t i = max_random_size; i < size; i += max_random_size) + { + std::copy_n(data.begin(), std::min(size - i, max_random_size), data.begin() + i); + } + return data; +} +#endif + template -inline std::vector get_random_data01(size_t size, float p, size_t max_random_size = 1024 * 1024) +inline std::vector get_random_data01(size_t size, float p, size_t max_random_size = default_max_random_size) { std::random_device rd; std::default_random_engine gen(rd()); diff --git a/benchmark/cmdparser.hpp b/benchmark/cmdparser.hpp index 5ffc24f6..50a6cb7e 100644 --- a/benchmark/cmdparser.hpp +++ b/benchmark/cmdparser.hpp @@ -185,6 +185,13 @@ namespace cli { return std::stoul(elements[0]); } + static unsigned long long parse(const std::vector& elements, const unsigned long long&) { + if (elements.size() != 1) + throw std::bad_cast(); + + return std::stoull(elements[0]); + } + static long parse(const std::vector& elements, const long&) { if (elements.size() != 1) throw std::bad_cast(); diff --git a/benchmark/common_benchmark_header.hpp b/benchmark/common_benchmark_header.hpp index 7327b3f6..6c1c70f0 100644 --- a/benchmark/common_benchmark_header.hpp +++ b/benchmark/common_benchmark_header.hpp @@ -31,6 +31,7 @@ #include #include #include +#include // Google Benchmark #include "benchmark/benchmark.h" diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake index 26a457b7..ee8ccb51 100644 --- a/cmake/Dependencies.cmake +++ b/cmake/Dependencies.cmake @@ -162,7 +162,11 @@ if(BUILD_BENCHMARK) set(GOOGLEBENCHMARK_ROOT ${CMAKE_CURRENT_BINARY_DIR}/deps/googlebenchmark CACHE PATH "") if(NOT (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")) # hip-clang cannot compile googlebenchmark for some reason - set(COMPILER_OVERRIDE "-DCMAKE_CXX_COMPILER=g++") + if(WIN32) + set(COMPILER_OVERRIDE "-DCMAKE_CXX_COMPILER=cl") + else() + set(COMPILER_OVERRIDE "-DCMAKE_CXX_COMPILER=g++") + endif() endif() download_project( @@ -171,7 +175,7 @@ if(BUILD_BENCHMARK) GIT_TAG v1.6.1 GIT_SHALLOW TRUE INSTALL_DIR ${GOOGLEBENCHMARK_ROOT} - CMAKE_ARGS -DCMAKE_BUILD_TYPE=RELEASE -DBENCHMARK_ENABLE_TESTING=OFF -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX= ${COMPILER_OVERRIDE} + CMAKE_ARGS -DCMAKE_BUILD_TYPE=RELEASE -DBENCHMARK_ENABLE_TESTING=OFF -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX= -DCMAKE_CXX_STANDARD=14 ${COMPILER_OVERRIDE} LOG_DOWNLOAD TRUE LOG_CONFIGURE TRUE LOG_BUILD TRUE @@ -181,4 +185,4 @@ if(BUILD_BENCHMARK) ) endif() find_package(benchmark REQUIRED CONFIG PATHS ${GOOGLEBENCHMARK_ROOT}) -endif() +endif() \ No newline at end of file diff --git a/rmake.py b/rmake.py index 9a5b90af..c71a1658 100644 --- a/rmake.py +++ b/rmake.py @@ -143,7 +143,7 @@ def config_cmd(): cmake_options.append( f"-DROCM_DISABLE_LDCONFIG=ON" ) if args.build_clients: - cmake_options.append( f"-DBUILD_TEST=ON -DBUILD_DIR={build_dir}" ) + cmake_options.append( f"-DBUILD_TEST=ON -DBUILD_BENCHMARK=ON -DBUILD_DIR={build_dir}" ) cmake_options.append( f"-DAMDGPU_TARGETS={args.gpu_architecture}" )