| From Vince Weaver: |
| |
| I've been running the SPEC CPU 2006 benchmarks under valgrind (doing some |
| work on my BBV generating plugin). |
| |
| There are two benchmarks that have issues, and I thought I'd share them |
| here for future reference. |
| |
| 1). zeusmp - does not run |
| |
| It has a 1GB data segment, which valgrind cannot handle on a 32-bit |
| CPU. |
| |
| 2). dealII - runs forever, never ending |
| |
| It took a while, but I tracked this down to a 64bit/80bit |
| floating point issue. |
| |
| The code in the QGauss<1>::QGauss() function has some code like this: |
| |
| const long double tolerance = std::max (static_cast<long double> |
| (std::numeric_limits<double>::epsilon() / 100), |
| static_cast<long double>(std::numeric_limits<long |
| double>::epsilon() *5)); |
| |
| do { |
| .... |
| various fp operations |
| .... |
| } while (abs(p1/pp) > tolerance); |
| |
| |
| The tolerance in this case is being set to ~2.22e-18, but the |
| abs(p1/pp) value never gets below ~2.586e-17 under valgrind. |
| |
| [This is because Valgrind only uses 64-bit FP values on x86, not 80-bit |
| values.] |
| |
| This is similar to an issue that happens with the "art" |
| benchmark on SPEC CPU 2000, but in the "art" case it only |
| makes the code take longer to finish; this "dealII" problem |
| makes the benchmark loop forever. |
| |