[patch, libgfortran] PR53029 missed optimization in internal read (without implied-do-loop)
Manfred Schwarb
manfred99@gmx.ch
Mon May 29 15:01:00 GMT 2017
Am 29.05.2017 um 01:16 schrieb Jerry DeLisle:
> Hi all,
>
> The problem here is that we never set the err return to LIBERROR_END in all cases. For the example case we are detecting the EOF condition inside the read_integer procedure and it gets acted on correctly at higher levels in the code. Consequently in the big loop over the array where we call list_formatted_read_scalar, we never returned an error code so we never exited the loop early.
>
> The patch tests for the EOF first locally as before, but then returns the error flags set in dtp->common.flags which are set globally in the individual read procedures whene hit_eof is called.
>
> Regression tested on x86_64. I have added a test case which will check the execution time of the loop. The previous results of the REAd were correct, just took a long time on large arrays.
>
Seems to work as advertised.
With this small patch, I see a tremendous speedup for array reads.
The implied-do variant gets slightly slower (~10%), but the
array variant now takes 0.002s independent of the size of "m",
compared to some dozens of seconds without this patch!
Concerning your test case:
Your timeout of 2s is dangerously close to the timings of really fast
boxes without this patch, so I would lower this value.
I guess even on really slow ARM boxes or some-such this test case finishes
in some few tenth of seconds, at worst.
Or, as the new behavior seems to be independent of the m setting,
just bump the constant m by a factor 10 or 100. So you are sure no big iron
can pass this test without your patch being applied.
Thanks a bunch!
Manfred
> OK for trunk?
>
> Regards,
>
> Jerry
>
> 2017-05-28 Jerry DeLisle <jvdelisle@gcc.gnu.org>
>
> PR libgfortran/35339
> * list_read.c.c (list_formatted_read_scala): Set the err return
> value to the common.flags error values.
More information about the Fortran
mailing list