Re: [Patch][Fortran] OpenACC – permit common blocks in some clauses
Tobias Burnus
tobias@codesourcery.com
Fri Nov 29 17:47:00 GMT 2019
Hi Thomas,
I have started with this email â and then stopped and replied to the
other email in this thread:
https://gcc.gnu.org/ml/gcc-patches/2019-11/msg02678.html â which covers
parts which otherwise would belong into this email.
On 11/28/19 6:02 PM, Thomas Schwinge wrote:
[Test case which uses common blocks in device_resident.]
> If you'd like to, please commit that, to document the status quo. (I
> have not reviewed.)
Did so as r278845 with a slightly updated comment.
>> Observations:
>> * !$acc declare has to come after the declaration of the common block.
That's now tracked in PR fortran/92728 for OpenMP/OpenACC â together
with blank commons.
> Good find -- purely a Fortran front end issue [â¦] is a reason
> (implementation complexity?)
Having any order makes it feel more Fortran like; the complexity comes
from splitting matching and checking the clauses, but it shouldn't be
rocket science.
>> * If I just use '!$acc parallel', the used variables are copied in
>> according to OpenMP 4.0 semantics, i.e. without a defaultmap clause (of
>> OpenMP 4.5+; not yet in gfortran), scalars are firstprivate and arrays
>> are map(fromto:). â Does this behaviour match the spec or should this
>> automatically mapped to, e.g., no_create as the 'device_resident' is
>> known? [Side remark: the module file does contain
>> "OACC_DECLARE_DEVICE_RESIDENT".]
> Not sure at this point.
s/OpenMP 4.0/OpenMP 4.5/
Regarding the mapping: Both OpenACC and OpenMP agree and it is fine (cf.
OpenACC 2.7 last 'Description' paragraph in parallel/kernels, 2.5.1 +
2.5.2). And OpenMP 4.5, Sect. 2.15.5 (esp. last three bullet points) or
OpenMP 5, Sect. 2.19.7. (Missing omp bits see PR fortran/92568.).
Regarding device_resident: It is not fully clear to me what the intent
is â and "The host may not be able to access variables in a
device_resident clause." does not make it clearer.
In terms of the spec, the mapping with firstprivate/[copy alias tofrom]
is fine â as is the explict use of present. However, if commons exists
on both device + host, 'copy(/block/)' should work and also copy
common-block variables, which are not referrenced in the
parallel/kernels block â which currently does not work.
>> * If I explicitly use '!$acc parallel present(/block/)' that fails
>> because present() does not permit common blocks.
>> (OpenACC 2.7, p36, l.1054: "For all clauses except deviceptr and
>> present, the list argument may include a Fortran common block name
>> enclosed within slashes").
> Do you understand the rationale behind that restriction, by the way? I'm
> not sure I do.
Regarding 'present', I don't: If copy/no_create is fine, why should
present be a problem? (And vice versa.)
For 'deviceptr', it kind of does make sense â unless one wants to store
the pointer as 'intptr_t' in an integer variable or want to have a
pointer (i.e. Fortran attribute) in 'common' which will cause mapping
problems for the common block. â In any case, the 'dummy argument'
constraint prevents common blocks. â BTW: Those constraints do not make
sense but seem to be same as for OpenMP's is_device_ptr. (They are both
too loose and to strict; I miss type(c_ptr) [as local var + as dummy w/
value attribute].)
Cheers,
Tobias
More information about the Fortran
mailing list