Boost logo

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