[llvm-dev] a proposed script to help with test-suite programs that output _lots_ of FP numbers

Abe Skolnik via llvm-dev llvm-dev at lists.llvm.org
Thu Sep 29 10:59:05 PDT 2016

Dear all,

As part of working on making test-suite less demanding of exact FP results so my FP-contraction 
patch can go back into trunk and stay there, today I analyzed 
"MultiSource/Benchmarks/VersaBench/beamformer".  I found that the raw output from that program 
is 2789780 bytes [i.e. ~2.7 _megabytes_] of floating-point text, which IMO is too much to put 
into a patch -- or at least a _civilized_ patch.  ;-)

As a result, I wrote the below Python program, which I think should deal with the problem 
fairly well, or at least is a good first attempt at doing so and can be improved later.  For 
the "MultiSource/Benchmarks/VersaBench/beamformer" test, using the same CLI arg.s as in the 
test-suite script, passing the output of the test through the below script gives me the 
following results.

Vanilla compiler, i.e. without FP-contraction patch

Compiler WITH FP-contraction patch

I think this output format should be acceptable for further processing by "fpcmp", since the # 
of FPs read will always be an integer.  At least with absolute tolerances, as long as abs_tol<1 
I think it should be OK.  Relative tolerances have me a little nervous; is there a way to tell 
"fpcmp" that integers that are output as such -- i.e. "13", not "13.0" -- are to be evaluated 
without any regard to tolerance?  Or maybe it already does it that way?  If not, then perhaps 
it`s easy to add that feature and have it be controlled by a flag, e.g. 
"--integers-ignore-tolerances", and have that flag be off by default for backwards compatibility.

If "fpcmp" currently cannot ignore tolerances for integers and cannot easily be extended to be 
able to do so, then I propose that the two calculated results go to separate outputs [2 files?] 
to be tested separately: the e.g. "output_count" file to be tested against its reference 
_exactly_, and the e.g. "output_sum" file to be tested against its reference with a positive 
tolerance.  I think I`d be able to make the Python code do that without anybody else`s help 
other than e.g. "yes, do that".

My apologies for not uploading the script yet; the LLVM Phabricator seems to be down over the 
past few minutes.




import math, sys

try_for_more = True

count = 0
total = 0.0

while try_for_more:
   line = sys.stdin.readline()
   if line:
     split_line = line.split() # handles ASCII horizontal tabs as well as ASCII horizontal spaces
     as_floats = [float(x) for x in split_line]
     for the_float in as_floats:
       if not ( math.isinf(the_float) or math.isnan(the_float) ):
         count = count + 1
         total = total + the_float
     try_for_more = False # cleaner than "break", I suppose

print (count)
print (total)

More information about the llvm-dev mailing list