Copyright: (c) 2009-2013 by Apple Inc. All Rights Reserved.math_brute_force test Feb 24, 2009=====================Usage:Please run the executable with --help for usage information.System Requirements:This test requires support for correctly rounded single and double precision arithmetic.The current version also requires a reasonably accurate operating system math library tobe present. The OpenCL implementation must be able to compile kernels online. The test assumesthat the host system stores its floating point data according to the IEEE-754 binary single anddouble precision floating point formats.Test Completion Time:This test takes a while. Modern desktop systems can usually finish it in 1-3days. Engineers doing OpenCL math library software development may find wimpy mode (-w)a useful screen to quickly look for problems in a new implementation, before committingto a lengthy test run. Likewise, it is possible to run just a range of tests, or specifictests. See Usage above.Test Design:This test is designed to do a somewhat exhaustive examination of the singleand double precision math library functions in OpenCL, for all vector lengths. Mathlibrary functions are compared against results from a higher precision referencefunction to determine correctness. All possible inputs are examined for unarysingle precision functions. Other functions are tested against a table of difficultvalues, followed by a few billion random values. If an error is found in a function,the test for that function terminates early, reports an error, and moves on to thenext test, if any.The test currently doesn't support half precision math functions covered in section9 of the OpenCL 1.0 specification, but does cover the half_func functions covered insection six. It also doesn't test the native_<funcname> functions, for which any resultis conformant.For the OpenCL 1.0 time frame, the reference library shall be the operating systemmath library, as modified by the test itself to conform to the OpenCL specification.That will help ensure that all devices on a particular operating system are returningsimilar results. Going forward to future OpenCL releases, it is planned to graduallyintroduce a reference math library directly into the test, so as to reduce inter-platform variance between OpenCL implementations.Generally speaking, this test will consider a result correct if it is one of the following:1) bitwise identical to the output of the reference function,rounded to the appropriate precision2) within the allowed ulp error tolerance of the infinitely preciseresult (as estimated by the reference function)3) If the reference result is a NaN, then any NaN is deemed correct.4) if the devices is running in FTZ mode, then the result is also correctif the infinitely precise result (as estimated by the referencefunction) is subnormal, and the returned result is a zero5) if the devices is running in FTZ mode, then we also calculate theestimate of the infinitely precise result with the reference functionwith subnormal inputs flushed to +- zero. If any of those resultsare within the error tolerance of the returned result, then it isdeemed correct6) half_func functions may flush per 4&5 above, even if the device is notin FTZ mode.7) Functions are allowed to prematurely overflow to infinity, so long asthe estimated infinitely precise result is within the stated ulperror limit of the maximum finite representable value of appropriatesign8) Functions are allowed to prematurely underflow (and if in FTZ mode,have behavior covered by 4&5 above), so long as the estimatedinfinitely precise result is within the stated ulp error limitof the minimum normal representable value of appropriate sign9) Some functions have limited range. Results of inputs outside that rangeare considered correct, so long as a result is returned.10) Some functions have infinite error bounds. Results of these functionare considered correct, so long as a result is returned.11) The test currently does not discriminate based on the sign of zeroWe anticipate a later test will.12) The test currently does not check to make sure that edge cases calledout in the standard (e.g. pow(1.0, any) = 1.0) are exactly correct.We anticipate a later test will.13) The test doesn't check IEEE flags or exceptions. See section 7.3 of theOpenCL standard.Performance Measurement:There is also some optional timing code available, currently turned off by default.These may be useful for tracking internal performance regressions, but is not required tobe part of the conformance submission.If the test is believed to be in error:The above correctness heuristics shall not be construed to be an alternative to the correctnesscriteria established by the OpenCL standard. An implementation shall be judged corrector not on appeal based on whether it is within prescribed error bounds of the infinitelyprecise result. (The ulp is defined in section 7.4 of the spec.) If the input value correspondsto an edge case listed in OpenCL specification sections covering edge case behavior, orsimilar sections in the C99 TC2 standard (section F.9 and G.6), the the function shall returnexactly that result, and the sign of a zero result shall be correct. In the event that the testis found to be faulty, resulting in a spurious failure result, the committee shall make a reasonableattempt to fix the test. If no practical and timely remedy can be found, then the implementationshall be granted a waiver.Guidelines for reference function error tolerances:Errors are measured in ulps, and stored in a single precision representation. So asto avoid introducing error into the error measurement due to error in the reference functionitself, the reference function should attempt to deliver 24 bits more precision than the testfunction return type. (All functions are currently either required to be correctly rounded ormay have >= 1 ulp of error. This places the 1's bit at the LSB of the result, with 23 bits ofsub-ulp accuracy. One more bit is required to avoid accrual of extra error due to round-to-nearest behavior. If we start to require sub-ulp precision, then the accuracy requirementsfor reference functions increase.) Therefore reference functions for single precision shouldhave 24+24=48 bits of accuracy, and reference functions for double precision should ideallyhave 53+24 = 77 bits of accuracy.A double precision system math library function should be sufficient to safely verify a singleprecision OpenCL math library function. A long double precision math library function may ormay not be sufficient to verify a double precision OpenCL math library function, depending onthe precision of the long double type. A later version of these tests is expected to replacelong double with a head+tail double double representation that can represent sufficient precision,on all platforms that support double.Revision history:Feb 24, 2009 IRO Created READMEAdded some reference functions so the test will run on Windows.