On 2012-07-26 03:58:33 +0900, Miles Bader wrote: > Vincent Lefevre <vinc...@vinc17.net> writes: > >> So... these functions were made almost an order of magnitude slower > >> in the (overwhelmingly) common case, in order to handle rare and > >> exceptional cases...? > > > > This depends on the processor. You should get a processor that > > handles rounding-mode change in a better way (the slowdown should > > not be noticeable when you just run the program, without looking at > > the exact running time). > > It's about 5 times slower on both phenom2 (AMD) and core2 (Intel) > cpus.... I dunno if these are unusual.
I can reproduce a 3.4x slowdown with: #include <stdio.h> #include <float.h> #include <math.h> #include <fenv.h> #pragma STDC FENV_ACCESS ON int main (void) { volatile double x = 1.0, y; int i; for (i = 0; i < 100000000; i++) { fesetround (FE_TONEAREST); y = exp(x); fesetround (FE_TONEAREST); } return y == 0.0; } and Debian's glibc and Intel Core 2 Duo. I'll try to have more information about why the processor doesn't detect that the rounding mode doesn't change. But with: #include <stdio.h> #include <float.h> #include <math.h> #include <fenv.h> #pragma STDC FENV_ACCESS ON int main (void) { volatile double x = 1.0, y; int i; for (i = 0; i < 100000000; i++) { int r = fegetround(); if (r != FE_TONEAREST) fesetround (FE_TONEAREST); y = exp(x); if (r != FE_TONEAREST) fesetround (r); } return y == 0.0; } I only get a 9% slowdown. I suppose that withing glibc code, it can be lower. The advantage of this method compared to remembering the rounding mode in glibc is that it is 100% safe, in case the user or some library bypasses the C libary to change the rounding mode. I think that there could be an optimization like that in fesetround() too. > Ok, I guess there's no really guaranteed way to make it fast, so > glibc's method (with arch-specific reimplementations for those cases > where it proves to be slow) it is reasonable enough ... Yes, the chosen method could depend on the processor. -- Vincent Lefèvre <vinc...@vinc17.net> - Web: <http://www.vinc17.net/> 100% accessible validated (X)HTML - Blog: <http://www.vinc17.net/blog/> Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon) -- To UNSUBSCRIBE, email to debian-devel-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20120726002713.ga6...@xvii.vinc17.org