From 359d08798b8303a77c62a25b1c039419fa169df7 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Mon, 4 Dec 2023 12:03:46 -0500 Subject: [PATCH] move by pieces --- benchmark/CMakeLists.txt | 5 +++++ benchmark/dual_benchmark.cpp | 20 ++++++++------------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt index 667902e..363e2b1 100644 --- a/benchmark/CMakeLists.txt +++ b/benchmark/CMakeLists.txt @@ -71,6 +71,11 @@ if(ENABLE_NATIVE_COMPILATION) check_cxx_compiler_flag("-mprefer-vector-width=512" VEC512) if(VEC512) target_compile_options(${PROJECT_NAME} PRIVATE -mprefer-vector-width=512) + if (CMAKE_CXX_COMPILER_ID MATCHES "GNU") + if (NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") + target_compile_options(${PROJECT_NAME} PRIVATE -mtune-ctrl=avx512_move_by_pieces) + endif() + endif() endif() endif() endif() diff --git a/benchmark/dual_benchmark.cpp b/benchmark/dual_benchmark.cpp index 5cf0d3a..4cafa0d 100644 --- a/benchmark/dual_benchmark.cpp +++ b/benchmark/dual_benchmark.cpp @@ -70,8 +70,8 @@ template struct ManualDual { auto grad() -> P & { return partials; } }; template -[[gnu::always_inline]] constexpr auto operator*(const ManualDual &a, - const ManualDual &b) +[[gnu::always_inline]] constexpr auto operator*(ManualDual a, + ManualDual b) -> ManualDual { if constexpr ((!B) && (!std::floating_point)&&(N == 2)) return {a.value * b.value, @@ -80,32 +80,28 @@ template else return {a.value * b.value, a.value * b.partials + b.value * a.partials}; } template -[[gnu::always_inline]] constexpr auto operator*(const ManualDual &a, - const T &b) +[[gnu::always_inline]] constexpr auto operator*(ManualDual a, T b) -> ManualDual { return {a.value * b, b * a.partials}; } template -[[gnu::always_inline]] constexpr auto operator*(const T &a, - const ManualDual &b) +[[gnu::always_inline]] constexpr auto operator*(T a, ManualDual b) -> ManualDual { return {b.value * a, a * b.partials}; } template -[[gnu::always_inline]] constexpr auto operator+(const ManualDual &a, - const ManualDual &b) +[[gnu::always_inline]] constexpr auto operator+(ManualDual a, + ManualDual b) -> ManualDual { return {a.value + b.value, a.partials + b.partials}; } template -[[gnu::always_inline]] constexpr auto operator+(const ManualDual &a, - const T &b) +[[gnu::always_inline]] constexpr auto operator+(ManualDual a, T b) -> ManualDual { return {a.value + b, a.partials}; } template -[[gnu::always_inline]] constexpr auto operator+(const T &a, - const ManualDual &b) +[[gnu::always_inline]] constexpr auto operator+(T a, ManualDual b) -> ManualDual { return {b.value + a, b.partials}; }