(j3.2006) F03/0084, was Re: Interp letter ballot #25

Malcolm Cohen malcolm
Sun May 13 23:16:09 EDT 2012

>On Fri, 2012-05-11 at 16:52 +0900, Malcolm Cohen wrote:
>> That was not the reason it lost support.  Even after it lost support, there 
>> was
>> still a subgroup tasked with providing "enabling facilities" for it.
>If you read my comment carefully, you will see that it says "ONE OF THE

It's not worth blethering about interval arithmetic all over again anyway, but 
if you read my comment, you would have noticed that I did not agree with you.

>  IEEE support for directed roundings was just one of the nails
>in the coffin.

IMO not even the rust on the top of one of the nails.  Not exactly a "coffin" 
anyway, since WG5 asked for "enabling features" to be added.  Which we didn't 
do.  WE ALL KNEW THAT WE DIDN'T DO IT.  Well, those of us paying attention, 
anyway (I've heard several people grumble specifically about that, and I could 
have sworn you were one of them too).

>It is true that if this interp stands,

Rephrased "It is true that unless we make sweeping changes to the Fortran 
standard to remove optimisability..."

This interp does nothing to inhibit interval arithmetic or otherwise.  There are 

>This is exactly why Ada has a "strict" mode, and the reason I advocated
>for a "strict" mode in Fortran,

Irrelevant to the question at hand.

>It is correct that there is a class of processors for which respecting
>the rounding mode is expensive,

Yes, and this is a growing percentage.  The only widely-used processor I am 
aware of on which it was not expensive was the DEC Alpha.  Note "was".  It is 
expensive on every commodity processor I have seen since.  There are a number of 
non-commodity specialistic processors that don't have a global rounding mode at 
all, really this is the only case where it is cheap (i.e. when it is encoded 
into each instruction).

>If "mathematically equivalent" includes "ignore IEEE rounding mode

No it does not.

> then we might as well remove the rounding mode facilities from
>the IEEE modules, since the result of this interpretation is "they don't
>actually work anyway."

They do work, they apply to the actual operations being executed.

Note that the rounding mode is inherited, so IEEE_SET_ROUNDING_MODE is 
frequently not visible.  That means that any optimisation-disabling effect that 
you apparently want it to have would potentially need to be applied to the 
entire program.

>It's clear that using
>VOLATILE was not contemplated as a means to make IEEE features work.

Correct, and it is not needed either.

My comment was simply showing one way of disabling unwanted optimisations, a way 
that works fairly locally.  Numerical analysts have been blocking unwanted 
optimisations via other ways for decades, this is not a new problem in any way 
nor does it have any necessary connection to IEEE rounding.  A single assignment 
to and reading from a VOLATILE variable is often cheaper than a whole external 
procedure invocation (the more traditional way of road-blocking the optimiser).

No good deed goes unpunished.  Serves me right for trying to be helpful!

>There is no new change or new feature in play here.  The essence of the
>interpretation is that there is a contradiction, which needs to be
>resolved, between the IEEE rounding features, and permission to use
>mathematically equivalent transformations.

There is no contradiction.  You have not shown any contradiction, and the interp 
makes NO EDIT.

You are demanding that optimisation be disallowed, and that WOULD be a new 
feature.  It is certainly not mentioned as any effect of IEEE_SET_ROUNDING_MODE.

>  The answer to this
>interpretation request need not be "mathematically equivalent wins."

They both "win"!  The rounding mode applies to the actual operations being 
executed.  The point being that after the permitted mathematical 
transformations, there are no operations being executed.

> Indeed, during development of Fortran 2003, there were
>arguments that the "mathematically equivalent" permission did not extend
>beyond a single expression.

The example in the interp does not need that either.

I repeat, there was no intention at any time to disable Fortran optimisation. 
Repeated assurances were made during the development of the "exception handing" 
extension and then the TR that it morphed into, that optimisations would 
continue to be applicable, apart from obvious ones like "no floating-point 
operation (code) motion across rounding mode changes".  There was no code motion 
required to answer this interp.

> draws a distinction between a mathematical difference and a
>computational difference.  Upward rounding of a default real expression,
>say <expr>, can be written
>  real(dble(<expr>) + 0.5*epsilon(1.0e0)*abs(<expr>))

No it cannot.

>which is, after all, what the processor does when upward rounding is

No it is not.

>  Replacing the second term with something not mathematically
>equivalent, say 0.0, or -0.5*epsilon(1.0e0)*abs(<expr>), or an arbitrary
>choice at the whim of the processor, is not a mathematically equivalent

If you actually write the code in question, rather than making incorrect 
assertions about what the code is equal to, you will of course get a different 

Your claims here would have the effect of "the processor cannot optimise away 
any of my floating-point operations".  This claim is not supported by the text 
of the standard.  This effect is (imnsho) Not Wanted by the rest of the Fortran 
community (nor, I would hazard, the rest of your own code).

> continues with the caveat "provided that the integrity of
>parentheses is not violated."  So if the example in 0084 had been
>             Z1 = (X * Y)
>             Z2 = (X * Y)
>             PRINT *, 'RESIDUAL: ', Z1 - Z2
>would a processor still always be allowed to print zero?

Yes.  Or rather, I don't see where I violated any parenthetical integrity - no 
associative or distributive law was invoked.

................................Malcolm Cohen, Nihon NAG, Tokyo. 

More information about the J3 mailing list