/* * -- High Performance Computing Linpack Benchmark (HPL) * HPL - 2.0 - September 10, 2008 * Antoine P. Petitet * University of Tennessee, Knoxville * Innovative Computing Laboratory * (C) Copyright 2000-2008 All Rights Reserved * * -- Copyright notice and Licensing terms: * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions, and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgement: * This product includes software developed at the University of * Tennessee, Knoxville, Innovative Computing Laboratory. * * 4. The name of the University, the name of the Laboratory, or the * names of its contributors may not be used to endorse or promote * products derived from this software without specific written * permission. * * -- Disclaimer: * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --------------------------------------------------------------------- */ /* * Include files */ #include "hpl.h" #ifdef STDC_HEADERS double HPL_pdlamch ( MPI_Comm COMM, const HPL_T_MACH CMACH ) #else double HPL_pdlamch ( COMM, CMACH ) MPI_Comm COMM; const HPL_T_MACH CMACH; #endif { /* * Purpose * ======= * * HPL_pdlamch determines machine-specific arithmetic constants such as * the relative machine precision (eps), the safe minimum(sfmin) such that * 1/sfmin does not overflow, the base of the machine (base), the precision * (prec), the number of (base) digits in the mantissa (t), whether * rounding occurs in addition (rnd = 1.0 and 0.0 otherwise), the minimum * exponent before (gradual) underflow (emin), the underflow threshold * (rmin)- base**(emin-1), the largest exponent before overflow (emax), the * overflow threshold (rmax) - (base**emax)*(1-eps). * * Arguments * ========= * * COMM (global/local input) MPI_Comm * The MPI communicator identifying the process collection. * * CMACH (global input) const HPL_T_MACH * Specifies the value to be returned by HPL_pdlamch * = HPL_MACH_EPS, HPL_pdlamch := eps (default) * = HPL_MACH_SFMIN, HPL_pdlamch := sfmin * = HPL_MACH_BASE, HPL_pdlamch := base * = HPL_MACH_PREC, HPL_pdlamch := eps*base * = HPL_MACH_MLEN, HPL_pdlamch := t * = HPL_MACH_RND, HPL_pdlamch := rnd * = HPL_MACH_EMIN, HPL_pdlamch := emin * = HPL_MACH_RMIN, HPL_pdlamch := rmin * = HPL_MACH_EMAX, HPL_pdlamch := emax * = HPL_MACH_RMAX, HPL_pdlamch := rmax * * where * * eps = relative machine precision, * sfmin = safe minimum, * base = base of the machine, * prec = eps*base, * t = number of digits in the mantissa, * rnd = 1.0 if rounding occurs in addition, * emin = minimum exponent before underflow, * rmin = underflow threshold, * emax = largest exponent before overflow, * rmax = overflow threshold. * * --------------------------------------------------------------------- */ /* * .. Local Variables .. */ double param; /* .. * .. Executable Statements .. */ param = HPL_dlamch( CMACH ); switch( CMACH ) { case HPL_MACH_EPS : case HPL_MACH_SFMIN : case HPL_MACH_EMIN : case HPL_MACH_RMIN : (void) HPL_all_reduce( (void *)(¶m), 1, HPL_DOUBLE, HPL_max, COMM ); break; case HPL_MACH_EMAX : case HPL_MACH_RMAX : (void) HPL_all_reduce( (void *)(¶m), 1, HPL_DOUBLE, HPL_min, COMM ); break; default : break; } return( param ); /* * End of HPL_pdlamch */ }