Насколько я понимаю, обертки повышенной точности Boost будут автоматически принимать такие выражения, как c = a+b, и превращать их в mpz_add(c, a, b). Будет ли Boost автоматически выполнять оптимизацию, такую ​​как преобразование умножения на степень 2 в сдвиги влево / вправо или другие подобные изменения?

1
qwr 16 Авг 2014 в 09:27
Boost выполняет некоторые оптимизации, но я не думаю, что он заменяет *8 на <<3. Однако gmpxx (официальная оболочка, поставляемая с GMP) работает с компиляторами gcc (и совместимыми).
 – 
Marc Glisse
16 Авг 2014 в 14:58
Интересный. Не могли бы вы опубликовать это в качестве ответа?
 – 
qwr
17 Авг 2014 в 09:28

1 ответ

Лучший ответ

Boost.Multiprecision выполняет ряд расширенных оптимизаций, в основном для минимизации количества временных переменных. Например, он изменит порядок a=(b*c)*a на a*=c; a*=b. Однако (в настоящее время, август 2014 г.) он не использует преимущества gcc __builtin_constant_p для дальнейшей оптимизации. gmpxx (официальная оболочка, распространяемая вместе с GMP), с другой стороны, заменит a=b*8 на a=b<<3. Обратите внимание, что без __builtin_constant_p было бы плохой идеей (в общей оболочке) проверять, является ли число степенью 2 перед умножением: если бы это было целесообразно, mpz_mul_ui уже сделал бы это.

Кроме того, когда я в последний раз проверял, другие компиляторы (clang, intel, oracle) имели лишь минимальную поддержку для __builtin_constant_p и не могли воспользоваться преимуществами его использования в gmpxx.

3
Marc Glisse 17 Авг 2014 в 18:09