ABataev added a comment.

In D65835#1623939 <https://reviews.llvm.org/D65835#1623939>, @hfinkel wrote:

> In D65835#1623903 <https://reviews.llvm.org/D65835#1623903>, @ABataev wrote:
>
> > In D65835#1623883 <https://reviews.llvm.org/D65835#1623883>, @hfinkel wrote:
> >
> > > In D65835#1623814 <https://reviews.llvm.org/D65835#1623814>, @hfinkel 
> > > wrote:
> > >
> > > > In D65835#1623772 <https://reviews.llvm.org/D65835#1623772>, @ABataev 
> > > > wrote:
> > > >
> > > > > In D65835#1623756 <https://reviews.llvm.org/D65835#1623756>, @kkwli0 
> > > > > wrote:
> > > > >
> > > > > > In D65835#1622042 <https://reviews.llvm.org/D65835#1622042>, 
> > > > > > @ABataev wrote:
> > > > > >
> > > > > > > > I want to be sure we're on the same page: For OpenMP 5.0, 
> > > > > > > > should we allow is_device_ptr with the private clauses?
> > > > > > >
> > > > > > > Yes, since it is allowed by the standard.
> > > > > >
> > > > > >
> > > > > > Umm ... I probably missed some earlier discussions!  What would be 
> > > > > > the behavior of the following code?
> > > > > >
> > > > > >   p = omp_target_alloc(...);
> > > > > >   #pragma omp target private(p) is_device_ptr(p)
> > > > > >     p[...] = ...;   // crash or not?
> > > > > >
> > > > >
> > > > >
> > > > > It must crush, I assume. The main problem is that this construct is 
> > > > > allowed by the standard.
> > > >
> > > >
> > > > Yep. We should add a warning message for it.
> > >
> > >
> > > Upon further reflection, this is not clearly allowed by the standard. My 
> > > experience is that, when reading standards, sometimes things are 
> > > disallowed by contradiction (i.e., the standard does not define some 
> > > behavior, and what the standard does say that's relevant is self 
> > > contradictory). In this case, 2.19.3 says that list items which are 
> > > privatized (and which are used) undergo replacement (with new items 
> > > created as specified) while 2.12.5 says that "The is_device_ptr clause is 
> > > used to indicate that a list item is a device pointer already in the 
> > > device data environment and that it should be used directly." A given 
> > > list item cannot simultaneously be "used directly" (2.12.5) and also 
> > > undergo replacement: "Inside the construct, all references to the 
> > > original list item are replaced by references to a new list item received 
> > > by the task or SIMD lane" (2.19.3). Thus, it may be disallowed.
> >
> >
> > I think, this combination is still allowed. I assume that
> >
> >   #Pragma omp target parallel is_device_ptr(a) <dsa_clause>(a)
> >
> >
> > is the same as
> >
> >   #pragma omp target is_device_ptr(a)
> >   #pragma omp parallel <dsa_clause>(a)
> >
> >
> > i.e. datasharing clauses are applied to inner sub-regions, not the target 
> > region itself.
>
>
> With the parallel, that makes sense to me. In that case, however, I'd imagine 
> that the privitization works as normal and the code wouldn't crash. Right?


It leads to the use of uninitialized memory. We create private non-initialized 
copy of the pointer, not the copy of the data it addresses. It shall work with 
firstprivate clause.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D65835/new/

https://reviews.llvm.org/D65835



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to