On Apr 15 2011, Tobias Burnus wrote:

(Frankly, I am not 100% sure about the exact semantics of ASYNCHRONOUS; I think might be implemented by preventing all code movements which involve swapping an ASYNCHRONOUS variable with a function call, which is not pure. Otherwise, in terms of the variable value, it acts like a normal variable, i.e. if one does: "a = 7" and does not set "a" afterwards (assignment or via function calls), it remains 7. The changing of the variable is explicit - even if it only becomes effective with some delay.)

I am, but I am not sure how to describe them.  The relevant constraints
on the program are in Fortran 2008 9.6.4.1 paras 5 and 6 (page 220),
and here is roughly what it means for the compiler.

The ASYNCHRONOUS attribute says that a variable may be used for such
purposes, and therefore can be changed unpredictably (if writable) or
referenced unpredictably, at any point while it is 'active' for asynchronous
I/O (i.e. it is a pending input-output sequence affector, a term that I
find bizarre).  It is a bit like the intent of VOLATILE, in that respect
only.  But it also says:

   1) The program may not change it if it is liable to be referenced,
or reference it if it is liable to be changed.  But this applies ONLY
during those windows of vulnerability.

   2) A window of vulnerability can be changed only by explicit action,
either an asynchronous I/O statement or calling a procedure that has
access to that variable.

Note that closing the window doesn't need explicit access, as it operates
on  just a 'transfer token', but that is as if the action that opened the
window squirreled away a pointer to the array when it started the
asynchronous I/O.

This means that, if a compiler can determine that code is NOT in a
window of vulnerability, all normal optimisations can be applied.  And,
if the window is for reference only, reference to the variable and taking
a copy is allowed.

For example, if there is an assignment statement to it or it is passed
as an argument to a procedure without ASYNCHRONOUS or INTENT(IN), the
compiler can tell that there is no I/O in progress at that point.

Similarly, if it is referenced or passed to a procedure without
ASYNCHRONOUS but with INTENT(IN), it may be being referenced but won't
be being changed (asynchronously).

Of course, that may not be the case.  But, if it isn't, the program is
broken, and the behaviour is undefined - so what the hell?

And I apologise about my English :-)  I don't have time just now to
rephrase it in less arcane usage, and am aware that it is tricky.

Regards,
Nick Maclaren.



Reply via email to