https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90030
Bug ID: 90030 Summary: Fortran OpenACC subarray data alignment Product: gcc Version: 9.0 Status: UNCONFIRMED Keywords: openacc Severity: normal Priority: P3 Component: fortran Assignee: unassigned at gcc dot gnu.org Reporter: tschwinge at gcc dot gnu.org CC: jakub at gcc dot gnu.org Target Milestone: --- As reported by Cesar in <https://gcc.gnu.org/ml/gcc-patches/2015-09/msg01664.html>, and later re-submitted in <https://gcc.gnu.org/ml/gcc-patches/2018-08/msg01911.html>. > In both OpenACC and OpenMP, each subarray has at least two data mappings > associated with them, one for the pointer and another for the data in > the array section (fortan also has a pset mapping). One problem I > observed in fortran is that array section data is casted to char *. > Consequently, when lower_omp_target assigns alignment for the subarray > data, it does so incorrectly. This is a problem on nvptx if you have a > data clause such as > > integer foo > real*8 bar (100) > > !$acc data copy (foo, bar(1:100)) > > Here, the data associated with bar could get aligned on a 4 byte > boundary instead of 8 byte. That causes problems on nvptx targets. > > My fix for this is to prevent the fortran front end from casting the > data pointers to char *. I only prevented casting on the code which > handles OMP_CLAUSE_MAP. The subarrays associated with OMP_CLAUSE_SHARED > also get casted to char *, but I left those as-is because I'm not that > familiar with how non-OpenMP target regions get lowered.