|
Boost : |
Subject: [boost] [multiprecision] Help needed with strange constexpr slowdown
From: John Maddock (jz.maddock_at_[hidden])
Date: 2017-12-31 19:50:53
Folks I have a very strange issue that I need help with understanding,
it comes from https://github.com/boostorg/multiprecision/issues/32 but
in summary:
Given:
#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
using namespace std;
using namespace boost::multiprecision;
int main()
{
__int128_t i =0;
__int128_t j =0;
int256_t sum =0;
for (; i <1e9; i +=19, j +=13)
{
int256_t diff = j;
sum += i * diff;
}
std::cout <<"Result: " << sum << std::endl;
return 0;
}
There is a 20-30% slowdown when compiled in C++11 or later compared to
C++03 with gcc 5.x or 6.x.
I've tracked this down to the constexpr default constructor for int256_t
(which is called inside operator* to create a temporary for the result),
if I make the default constructor non-constexpr by removing
BOOST_CONSTEXPR from any of:
number.hpp:44 (number())
cpp_int.hpp:1077 (cpp_int_backend())
cpp_int.hpp:501 (cpp_int_base())
cpp_int.hpp: 435 (cpp_int_base::data_type())
Then the slowdown disappears. All the line numbers refer to current
develop BTW.
gcc-7 is better, but I notice it still generates different code if the
constructor is constexpr - that greatly surprises me to be frank - is
there something I'm missing about constexpr-ness that could cause this?
Confused yours, John.
--- This email has been checked for viruses by AVG. http://www.avg.com
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk