flintlib / flint

FLINT (Fast Library for Number Theory)
http://www.flintlib.org
GNU Lesser General Public License v3.0
401 stars 235 forks source link

Specialize addmul, submul for nfloat #1980

Closed fredrik-johansson closed 1 month ago

fredrik-johansson commented 1 month ago

Adds nfloat_addmul, nfloat_submul and _nfloat_vec_addmul_scalar and _nfloat_vec_submul_scalar with partially inlined code for speed.

The accuracy is identical to doing a mul followed by an add; it would be nice to have something with increased accuracy, or with better speed when the product is much smaller than the sum, but I can't be bothered with all the extra addition code to implement something like that right now.

$ build/nfloat/profile/p-vs_arf 
                   _gr_vec_add          _gr_vec_mul       _gr_vec_mul_scalar  _gr_vec_addmul_scalar  _gr_vec_sum          _gr_vec_product      _gr_vec_dot
prec = 64
n =   10        3.180e-08 (3.994x)   1.820e-08 (7.363x)   1.470e-08 (9.320x)   3.600e-08 (7.639x)   4.610e-08 (2.625x)   3.260e-08 (3.681x)   2.440e-08 (2.078x)
n =  100        2.910e-07 (4.502x)   1.480e-07 (9.122x)   1.130e-07 (12.212x)   3.290e-07 (8.207x)   4.780e-07 (2.782x)   3.910e-07 (3.581x)   1.790e-07 (2.168x)
prec = 128
n =   10        4.340e-08 (4.770x)   2.880e-08 (5.069x)   2.560e-08 (5.820x)   5.970e-08 (5.980x)   4.790e-08 (3.841x)   4.070e-08 (3.243x)   3.710e-08 (1.779x)
n =  100        3.950e-07 (5.190x)   2.560e-07 (5.664x)   2.160e-07 (6.852x)   5.570e-07 (6.607x)   6.010e-07 (3.594x)   5.360e-07 (2.817x)   3.160e-07 (1.608x)
prec = 192
n =   10        5.410e-08 (4.362x)   5.850e-08 (2.889x)   6.020e-08 (2.841x)   8.160e-08 (5.380x)   5.540e-08 (3.971x)   6.230e-08 (2.440x)   7.570e-08 (2.391x)
n =  100        4.960e-07 (4.839x)   5.650e-07 (2.973x)   5.820e-07 (2.938x)   7.810e-07 (5.698x)   5.840e-07 (4.418x)   7.140e-07 (2.577x)   6.810e-07 (2.452x)
prec = 256
n =   10        6.380e-08 (3.981x)   7.590e-08 (2.477x)   7.370e-08 (2.578x)   1.080e-07 (4.296x)   5.940e-08 (3.788x)   7.280e-08 (2.321x)   1.020e-07 (2.000x)
n =  100        5.800e-07 (4.345x)   7.440e-07 (2.540x)   7.200e-07 (2.667x)   1.050e-06 (4.495x)   6.570e-07 (4.018x)   8.860e-07 (2.291x)   9.330e-07 (2.058x)
prec = 512
n =   10        1.320e-07 (2.053x)   1.620e-07 (2.006x)   1.610e-07 (2.025x)   2.570e-07 (2.377x)   9.830e-08 (2.370x)   1.450e-07 (1.993x)   2.500e-07 (1.448x)
n =  100        1.280e-06 (2.117x)   1.620e-06 (2.068x)   1.650e-06 (2.067x)   2.580e-06 (2.508x)   1.140e-06 (2.500x)   1.680e-06 (2.095x)   2.430e-06 (1.477x)
prec = 1024
n =   10        1.810e-07 (1.801x)   7.550e-07 (1.391x)   7.560e-07 (1.323x)   8.880e-07 (1.543x)   1.310e-07 (1.992x)   7.240e-07 (1.298x)   8.360e-07 (1.256x)
n =  100        1.700e-06 (1.859x)   7.820e-06 (1.432x)   7.780e-06 (1.427x)   9.040e-06 (1.670x)   1.500e-06 (2.227x)   8.280e-06 (1.389x)   8.250e-06 (1.309x)
prec = 2048
n =   10        2.420e-07 (1.620x)   2.520e-06 (1.254x)   2.520e-06 (1.258x)   2.740e-06 (1.325x)   1.820e-07 (1.874x)   2.320e-06 (1.263x)   2.650e-06 (1.147x)
n =  100        2.660e-06 (1.553x)   2.710e-05 (1.295x)   2.520e-05 (1.484x)   2.670e-05 (1.607x)   2.110e-06 (2.014x)   2.620e-05 (1.397x)   2.580e-05 (1.194x)