From b5bcb13161d6cdfc9bd3b138dbf617c131339f85 Mon Sep 17 00:00:00 2001 From: Stanley Tsang Date: Thu, 15 Dec 2022 10:08:22 -0700 Subject: [PATCH 1/6] HIP SDK spaces support, plus previous benchmark fixes --- benchmark/benchmark_utils.hpp | 66 +++++++++++++++++++++++++-- benchmark/cmdparser.hpp | 7 +++ benchmark/common_benchmark_header.hpp | 1 + cmake/Dependencies.cmake | 8 +++- rmake.py | 12 ++++- toolchain-windows.cmake | 5 +- 6 files changed, 90 insertions(+), 9 deletions(-) diff --git a/benchmark/benchmark_utils.hpp b/benchmark/benchmark_utils.hpp index c7cfd47a..9f9326a2 100644 --- a/benchmark/benchmark_utils.hpp +++ b/benchmark/benchmark_utils.hpp @@ -43,11 +43,11 @@ 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 +66,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 +84,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..6cf82788 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 2fb885c5..1d890bb0 100644 --- a/cmake/Dependencies.cmake +++ b/cmake/Dependencies.cmake @@ -182,7 +182,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( @@ -191,7 +195,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 diff --git a/rmake.py b/rmake.py index 9874946f..e5b9d288 100644 --- a/rmake.py +++ b/rmake.py @@ -72,6 +72,12 @@ def delete_dir(dir_path) : linux_path = pathlib.Path(dir_path).absolute() #print( linux_path ) run_cmd( "rm" , f"-rf {linux_path}") + +def cmake_path(os_path): + if os.name == "nt": + return os_path.replace("\\", "/") + else: + return os.path.realpath(os_path) def config_cmd(): global args @@ -85,7 +91,9 @@ def config_cmd(): cmake_platform_opts = [] if (OS_info["ID"] == 'windows'): # we don't have ROCM on windows but have hip, ROCM can be downloaded if required - rocm_path = os.getenv( 'ROCM_PATH', "C:/hipsdk/rocm-cmake-master") #C:/hip") # rocm/Utils/cmake-rocm4.2.0" + # CMAKE_PREFIX_PATH set to rocm_path and HIP_PATH set BY SDK Installer + raw_rocm_path = cmake_path(os.getenv('HIP_PATH', "C:/hip")) + rocm_path = f'"{raw_rocm_path}"' # guard against spaces in path cmake_executable = "cmake.exe" toolchain = os.path.join( src_path, "toolchain-windows.cmake" ) #set CPACK_PACKAGING_INSTALL_PREFIX= defined as blank as it is appended to end of path for archive creation @@ -143,7 +151,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}" ) diff --git a/toolchain-windows.cmake b/toolchain-windows.cmake index 233e074c..6afe6741 100644 --- a/toolchain-windows.cmake +++ b/toolchain-windows.cmake @@ -3,7 +3,10 @@ # Ninja doesn't support platform #set(CMAKE_GENERATOR_PLATFORM x64) -if (DEFINED ENV{HIP_DIR}) +if (DEFINED ENV{HIP_PATH}) + file(TO_CMAKE_PATH "$ENV{HIP_PATH}" HIP_DIR) + set(rocm_bin "${HIP_DIR}/bin") +elseif (DEFINED ENV{HIP_DIR}) file(TO_CMAKE_PATH "$ENV{HIP_DIR}" HIP_DIR) set(rocm_bin "${HIP_DIR}/bin") else() From 1244755fe9bf30fefba62ef03d2413d36aeb6e42 Mon Sep 17 00:00:00 2001 From: Stanley Tsang Date: Tue, 20 Dec 2022 23:25:04 -0700 Subject: [PATCH 2/6] Better fix for Windows --- benchmark/benchmark_utils.hpp | 61 ++--------------------------------- 1 file changed, 2 insertions(+), 59 deletions(-) diff --git a/benchmark/benchmark_utils.hpp b/benchmark/benchmark_utils.hpp index 9f9326a2..de250f0f 100644 --- a/benchmark/benchmark_utils.hpp +++ b/benchmark/benchmark_utils.hpp @@ -52,7 +52,8 @@ inline auto get_random_data(size_t size, T min, T max, size_t max_random_size = { std::random_device rd; std::default_random_engine gen(rd()); - std::uniform_int_distribution distribution(min, max); + using distribution_type = typename std::conditional<(sizeof(T)==1), short, T>::type; + std::uniform_int_distribution distribution(min, max); std::vector data(size); std::generate( data.begin(), data.begin() + std::min(size, max_random_size), @@ -84,64 +85,6 @@ 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 = default_max_random_size) { From 205f9cf6899917d70b2b18a29fce5c8ded530cfb Mon Sep 17 00:00:00 2001 From: Stanley Tsang Date: Tue, 3 Jan 2023 14:50:41 -0700 Subject: [PATCH 3/6] Update cmake_path function for rmake.py --- rmake.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rmake.py b/rmake.py index e5b9d288..fe5f4193 100644 --- a/rmake.py +++ b/rmake.py @@ -74,7 +74,7 @@ def delete_dir(dir_path) : run_cmd( "rm" , f"-rf {linux_path}") def cmake_path(os_path): - if os.name == "nt": + if OS_info["ID"] == "windows": return os_path.replace("\\", "/") else: return os.path.realpath(os_path) From 32bc5dc6dcec62a820bc297a71c278dc56aa82d6 Mon Sep 17 00:00:00 2001 From: Stanley Tsang Date: Tue, 3 Jan 2023 15:24:39 -0700 Subject: [PATCH 4/6] Update copyright --- rmake.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rmake.py b/rmake.py index fe5f4193..9a1dce38 100644 --- a/rmake.py +++ b/rmake.py @@ -1,5 +1,5 @@ #!/usr/bin/python3 -"""Copyright 2020-2021 Advanced Micro Devices, Inc. +"""Copyright 2020-2023 Advanced Micro Devices, Inc. Manage build and installation""" import re From 175b6d2a562a79498e19920234e4996a9a943a82 Mon Sep 17 00:00:00 2001 From: Stanley Tsang Date: Wed, 25 Jan 2023 13:33:09 -0800 Subject: [PATCH 5/6] Cleanup toolchain-windows.cmake, compatibility with HIP SDK --- toolchain-windows.cmake | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/toolchain-windows.cmake b/toolchain-windows.cmake index 6afe6741..866a171d 100644 --- a/toolchain-windows.cmake +++ b/toolchain-windows.cmake @@ -14,30 +14,21 @@ else() set(rocm_bin "C:/hip/bin") endif() -#set(CMAKE_CXX_COMPILER "${rocm_bin}/hipcc.bat") -#set(CMAKE_C_COMPILER "${rocm_bin}/hipcc.bat") set(CMAKE_CXX_COMPILER "${rocm_bin}/clang++.exe") set(CMAKE_C_COMPILER "${rocm_bin}/clang.exe") -#set(CMAKE_CXX_LINKER "${rocm_bin}/hipcc.bat" ) - -# TODO remove, just to speed up slow cmake -set(CMAKE_C_COMPILER_WORKS 1) -set(CMAKE_CXX_COMPILER_WORKS 1) -# +if (NOT python) + set(python "python") # take default for windows +endif() -#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -IC:/hip/include -IC:/hip/lib/clang/12.0.0 -DWIN32 -D_CRT_SECURE_NO_WARNINGS") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${HIP_DIR}/include -DWIN32 -D_CRT_SECURE_NO_WARNINGS") +# our usage flags +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWIN32 -D_CRT_SECURE_NO_WARNINGS") # flags for clang direct use -#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -fms-extensions -fms-compatibility") # -Wno-ignored-attributes to avoid warning: __declspec attribute 'dllexport' is not supported [-Wignored-attributes] which is used by msvc compiler set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -fms-extensions -fms-compatibility -Wno-ignored-attributes") -# flags for clang direct use with hip -# -x hip causes linker error -#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -x hip -IC:/hip/include/hip -D__HIP_PLATFORM_AMD__ -D__HIP_ROCclr__ -DHIP_CLANG_HCC_COMPAT_MODE=1") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${HIP_DIR}/include/hip -D__HIP_PLATFORM_AMD__ -D__HIP_ROCclr__ -DHIP_CLANG_HCC_COMPAT_MODE=1") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__HIP_PLATFORM_AMD__ -D__HIP_ROCclr__ -DHIP_CLANG_HCC_COMPAT_MODE=1") if (DEFINED ENV{VCPKG_PATH}) file(TO_CMAKE_PATH "$ENV{VCPKG_PATH}" VCPKG_PATH) @@ -45,8 +36,3 @@ else() set(VCPKG_PATH "C:/github/vcpkg") endif() include("${VCPKG_PATH}/scripts/buildsystems/vcpkg.cmake") -# set(GTEST_DIR "C:/rocm/Utils/GTestMSVC") -# set(GTEST_INCLUDE_DIR "${GTEST_DIR}/include") -# set(GTEST_LIBRARY "${GTEST_DIR}/lib/Release/gtest.lib") -# set(GTEST_MAIN_LIBRARY "${GTEST_DIR}/lib/Release/gtest_main.lib") -# set(GTEST_LIBRARIES "${GTEST_DIR}/lib/Release/gtest.lib;${GTEST_DIR}/lib/Release/gtest_main.lib") From 4df01bc9bb4bb6021db49e70a339e26ae8b3793c Mon Sep 17 00:00:00 2001 From: Stanley Tsang Date: Thu, 26 Jan 2023 14:17:45 -0800 Subject: [PATCH 6/6] Take python3 by default --- toolchain-windows.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toolchain-windows.cmake b/toolchain-windows.cmake index 866a171d..b14405ca 100644 --- a/toolchain-windows.cmake +++ b/toolchain-windows.cmake @@ -18,7 +18,7 @@ set(CMAKE_CXX_COMPILER "${rocm_bin}/clang++.exe") set(CMAKE_C_COMPILER "${rocm_bin}/clang.exe") if (NOT python) - set(python "python") # take default for windows + set(python "python3") # take default for windows endif() # our usage flags