From b2fd68fe67d103efd80a23dd28ff9c1fd669287e Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 30 Jun 2020 13:41:20 +0200 Subject: [PATCH] Improve std::plus void detection --- CMakeLists.txt | 27 +++++++++++-------- src/tests/CMakeLists.txt | 4 +-- src/tests/benchmarks/CMakeLists.txt | 4 +-- src/tests/benchmarks/benchmark_detector.cc | 9 ++++--- .../arithmetic/preamble_correlator_test.cc | 21 +++++++-------- 5 files changed, 35 insertions(+), 30 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 99f5d71bf..21a47be41 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -460,17 +460,6 @@ else() endif() endif() -# Availability of std::plus without class specifier -if(CMAKE_CXX_STANDARD VERSION_GREATER 11) - if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 5.4.0) - set(HAVE_STD_PLUS ON) - endif() - else() - set(HAVE_STD_PLUS ON) - endif() -endif() - ################################################################################ @@ -901,6 +890,22 @@ check_cxx_source_compiles(" +################################################################################ +# Detect availability of std::plus without class specifier +################################################################################ +unset(has_std_plus_void CACHE) +if(CMAKE_CXX_STANDARD VERSION_GREATER 11) + include(CheckCXXSourceCompiles) + check_cxx_source_compiles(" + #include  + int main() + { [](float a=1, float b=0){return std::plus<>();}; };" + has_std_plus_void + ) +endif() + + + ################################################################################ # VOLK - Vector-Optimized Library of Kernels ################################################################################ diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index d16ab8b67..7376b97d5 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -238,8 +238,8 @@ if(ARMADILLO_VERSION_STRING VERSION_GREATER 8.400) add_definitions(-DARMADILLO_HAVE_MVNRND=1) endif() -if(HAVE_STD_PLUS) - add_definitions(-DCOMPILER_HAS_STD_PLUS=1) +if(has_std_plus_void) + add_definitions(-DCOMPILER_HAS_STD_PLUS_VOID=1) endif() find_package(Gnuplot) diff --git a/src/tests/benchmarks/CMakeLists.txt b/src/tests/benchmarks/CMakeLists.txt index afd6792b2..56e872697 100644 --- a/src/tests/benchmarks/CMakeLists.txt +++ b/src/tests/benchmarks/CMakeLists.txt @@ -107,6 +107,6 @@ add_benchmark(benchmark_preamble core_system_parameters) add_benchmark(benchmark_detector core_system_parameters) -if(HAVE_STD_PLUS) - target_compile_definitions(benchmark_detector PRIVATE -DCOMPILER_HAS_STD_PLUS=1) +if(has_std_plus_void) + target_compile_definitions(benchmark_detector PRIVATE -DCOMPILER_HAS_STD_PLUS_VOID=1) endif() diff --git a/src/tests/benchmarks/benchmark_detector.cc b/src/tests/benchmarks/benchmark_detector.cc index c5ab5caab..a31bbe3ca 100644 --- a/src/tests/benchmarks/benchmark_detector.cc +++ b/src/tests/benchmarks/benchmark_detector.cc @@ -83,7 +83,7 @@ void bm_accumulate(benchmark::State& state) } } -#if COMPILER_HAS_STD_PLUS + void bm_inner_product(benchmark::State& state) { std::vector d_symbol_history(GPS_CA_PREAMBLE_LENGTH_SYMBOLS, 0.0); @@ -104,15 +104,16 @@ void bm_inner_product(benchmark::State& state) d_symbol_history.end(), d_preamble_samples.begin(), 0, +#if COMPILER_HAS_STD_PLUS_VOID std::plus<>(), +#else + std::plus(), +#endif [&](float a, float b) { return (std::signbit(a) ? -b : b); }); } } -#endif BENCHMARK(bm_forloop); BENCHMARK(bm_accumulate); -#if COMPILER_HAS_STD_PLUS BENCHMARK(bm_inner_product); -#endif BENCHMARK_MAIN(); diff --git a/src/tests/unit-tests/arithmetic/preamble_correlator_test.cc b/src/tests/unit-tests/arithmetic/preamble_correlator_test.cc index 02dae6c6b..6c4b98c11 100644 --- a/src/tests/unit-tests/arithmetic/preamble_correlator_test.cc +++ b/src/tests/unit-tests/arithmetic/preamble_correlator_test.cc @@ -84,7 +84,6 @@ TEST(PreambleCorrelationTest, TestMethods) } end2 = std::chrono::system_clock::now(); -#if COMPILER_HAS_STD_PLUS // Compute correlation, method 3 start3 = std::chrono::system_clock::now(); for (int64_t iter = 0; iter < n_iter; iter++) @@ -93,25 +92,25 @@ TEST(PreambleCorrelationTest, TestMethods) d_symbol_history.begin() + GPS_CA_PREAMBLE_LENGTH_BITS, d_preamble_samples.begin(), 0, +#if COMPILER_HAS_STD_PLUS_VOID std::plus<>(), - [&](float a, float b) { return (std::signbit(a) ? -b : b); }); +#else + std::plus(), +#endif sum_corr3 += corr_value3; } end3 = std::chrono::system_clock::now(); - std::chrono::duration elapsed_seconds3 = end3 - start3; - EXPECT_EQ(corr_value, corr_value3); - EXPECT_EQ(sum_corr1, sum_corr3); -#endif - - EXPECT_EQ(corr_value, corr_value2); - EXPECT_EQ(sum_corr1, sum_corr2); std::chrono::duration elapsed_seconds = end - start; std::chrono::duration elapsed_seconds2 = end2 - start2; + std::chrono::duration elapsed_seconds3 = end3 - start3; + + EXPECT_EQ(corr_value, corr_value2); + EXPECT_EQ(sum_corr1, sum_corr2); + EXPECT_EQ(corr_value, corr_value3); + EXPECT_EQ(sum_corr1, sum_corr3); std::cout << "Correlation computed with 'C for' : done in " << elapsed_seconds.count() * 1.0e9 / n_iter << " nanoseconds" << std::endl; std::cout << "Correlation computed with accumulate : done in " << elapsed_seconds2.count() * 1.0e9 / n_iter << " nanoseconds" << std::endl; -#if COMPILER_HAS_STD_PLUS std::cout << "Correlation computed with inner_product : done in " << elapsed_seconds3.count() * 1.0e9 / n_iter << " nanoseconds" << std::endl; -#endif }