doru1004 added inline comments.
================
Comment at: clang/test/OpenMP/target_data_use_device_addr_codegen_ptr.cpp:14
+ {
+ #pragma omp target data use_device_addr(x)
+ {
----------------
ye-luo wrote:
> doru1004 wrote:
> > ye-luo wrote:
> > > doru1004 wrote:
> > > > ye-luo wrote:
> > > > > doru1004 wrote:
> > > > > > ye-luo wrote:
> > > > > > > In my understanding of the spec.
> > > > > > > `map(tofrom:x[0:256])` only maps the memory segment that x points
> > > > > > > to. x itself as a pointer scalar is not mapped.
> > > > > > > use_device_addr(x) should fail to find the map of x scalar.
> > > > > > > 5.2 spec.
> > > > > > > If the list item is not a mapped list item, it is assumed to be
> > > > > > > accessible on the target device.
> > > > > > > To me, it seems just keep &x as it was, in this case &x remains a
> > > > > > > host address.
> > > > > > >
> > > > > > > But in your patch description, it seems treating x differently
> > > > > > > from a scalar.
> > > > > > >
> > > > > > > I also applied your patch on main and got segfault because the x
> > > > > > > has a value of device address and x[0] fails. This should be the
> > > > > > > behavior of use_device_ptr instead of use_device_addr.
> > > > > > > To me, it seems just keep &x as it was, in this case &x remains a
> > > > > > > host address.
> > > > > >
> > > > > > So does this mean that if I do something like this in the target
> > > > > > data I should get different addresses for x:
> > > > > >
> > > > > >
> > > > > > ```
> > > > > > #pragma omp target data use_device_ptr(x)
> > > > > > {
> > > > > > fprintf(stderr, "x: %p\n", __LINE__, x);
> > > > > > }
> > > > > >
> > > > > > #pragma omp target data use_device_addr(x)
> > > > > > {
> > > > > > fprintf(stderr, "x: %p\n", __LINE__, x);
> > > > > > }
> > > > > > ```
> > > > > >
> > > > > >
> > > > > > > I also applied your patch on main and got segfault because the x
> > > > > > > has a value of device address and x[0] fails.
> > > > > >
> > > > > > That's my fault x[0] was the wrong thing to use actually.
> > > > > >
> > > > > >
> > > > > When you have an outer `target data map(x)`, then two printf differ.
> > > > > If there is no outer `map(x)`, two printf should be identical.
> > > > > When you have an outer `target data map(x)`, then two printf differ.
> > > > > If there is no outer `map(x)`, two printf should be identical.
> > > >
> > > > This is super helpful thank you! I'll make sure that happens.
> > > >
> > > > In the case when an outer target data exists, the print of the x which
> > > > is under use_device_addr should print the same address as printing x on
> > > > the host?
> > > I need a correction. When outer map(x) exists, actually the address(not
> > > value) of x should be a device address, and the code cannot even print x.
> > > Printing &x should be fine.
> > In the context of the above comment, should &x on the device be an address
> > I can verify, somehow, to make sure that it's correct or is it a completely
> > new device address?
> >
> > So for example, should it be the same as when I do a use_device_ptr but
> > print the &x in that case? (With the current master those two addresses are
> > not the same.)
> >
> > I guess what I need is an example of using use_device_addr that actually
> > does something meaningful because with the current main branch printing the
> > &x of a use_device_addr(x) is nil.
> When an outer map(x) is placed, &x does print something meaningful.
> I tried to access `omp_get_mapped_ptr(&x, omp_get_default_device())` but got
> link time error about missing omp_get_mapped_ptr definition. It seems missing
> an implementation of this OpenMP API.
>
> When there is no map(x), I also got nil, I think this is a bug, &x should
> keep the host value.
>
> I cannot think of a useful example with use_device_addr(x) where x is a
> pointer. But x can be a scalar float.
> and then call cublas gemm, the alpha/beta parameter can be &x.
> When an outer map(x) is placed, &x does print something meaningful.
For me, in the same scenario, it prints nil.
Here's the full example to avoid any confusion:
```
float *x = (float *) malloc(10*sizeof(float));
#pragma omp target data map(to:x[0:10])
{
#pragma omp target data use_device_ptr(x)
{
fprintf(stderr, "line %d x: %p\n", __LINE__, x); // prints address
0x7f0bda400000
}
#pragma omp target data use_device_addr(x)
{
fprintf(stderr, "line %d x: %p\n", __LINE__, &x); // prints nil for
me
}
}
}
```
Note that x has been mapped to the device in the following way:
```
Libomptarget device 0 info: Host Ptr Target Ptr
Libomptarget device 0 info: 0x00005578f14de020 0x00007f0bda400000
```
What should the printed address be though?
Note that the above results have been obtained with current Clang/LLVM main not
with this patch applied.
If you apply this patch and run the above code but change the &x into a x you
get:
```
float *x = (float *) malloc(10*sizeof(float));
#pragma omp target data map(to:x[0:10])
{
#pragma omp target data use_device_ptr(x)
{
fprintf(stderr, "line %d x: %p\n", __LINE__, x); // prints address
0x7f0bda400000
}
#pragma omp target data use_device_addr(x)
{
fprintf(stderr, "line %d x: %p\n", __LINE__, x); // prints address
0x7f0bda400000
}
}
}
```
================
Comment at: clang/test/OpenMP/target_data_use_device_addr_codegen_ptr.cpp:14
+ {
+ #pragma omp target data use_device_addr(x)
+ {
----------------
doru1004 wrote:
> ye-luo wrote:
> > doru1004 wrote:
> > > ye-luo wrote:
> > > > doru1004 wrote:
> > > > > ye-luo wrote:
> > > > > > doru1004 wrote:
> > > > > > > ye-luo wrote:
> > > > > > > > In my understanding of the spec.
> > > > > > > > `map(tofrom:x[0:256])` only maps the memory segment that x
> > > > > > > > points to. x itself as a pointer scalar is not mapped.
> > > > > > > > use_device_addr(x) should fail to find the map of x scalar.
> > > > > > > > 5.2 spec.
> > > > > > > > If the list item is not a mapped list item, it is assumed to be
> > > > > > > > accessible on the target device.
> > > > > > > > To me, it seems just keep &x as it was, in this case &x remains
> > > > > > > > a host address.
> > > > > > > >
> > > > > > > > But in your patch description, it seems treating x differently
> > > > > > > > from a scalar.
> > > > > > > >
> > > > > > > > I also applied your patch on main and got segfault because the
> > > > > > > > x has a value of device address and x[0] fails. This should be
> > > > > > > > the behavior of use_device_ptr instead of use_device_addr.
> > > > > > > > To me, it seems just keep &x as it was, in this case &x remains
> > > > > > > > a host address.
> > > > > > >
> > > > > > > So does this mean that if I do something like this in the target
> > > > > > > data I should get different addresses for x:
> > > > > > >
> > > > > > >
> > > > > > > ```
> > > > > > > #pragma omp target data use_device_ptr(x)
> > > > > > > {
> > > > > > > fprintf(stderr, "x: %p\n", __LINE__, x);
> > > > > > > }
> > > > > > >
> > > > > > > #pragma omp target data use_device_addr(x)
> > > > > > > {
> > > > > > > fprintf(stderr, "x: %p\n", __LINE__, x);
> > > > > > > }
> > > > > > > ```
> > > > > > >
> > > > > > >
> > > > > > > > I also applied your patch on main and got segfault because the
> > > > > > > > x has a value of device address and x[0] fails.
> > > > > > >
> > > > > > > That's my fault x[0] was the wrong thing to use actually.
> > > > > > >
> > > > > > >
> > > > > > When you have an outer `target data map(x)`, then two printf
> > > > > > differ. If there is no outer `map(x)`, two printf should be
> > > > > > identical.
> > > > > > When you have an outer `target data map(x)`, then two printf
> > > > > > differ. If there is no outer `map(x)`, two printf should be
> > > > > > identical.
> > > > >
> > > > > This is super helpful thank you! I'll make sure that happens.
> > > > >
> > > > > In the case when an outer target data exists, the print of the x
> > > > > which is under use_device_addr should print the same address as
> > > > > printing x on the host?
> > > > I need a correction. When outer map(x) exists, actually the address(not
> > > > value) of x should be a device address, and the code cannot even print
> > > > x. Printing &x should be fine.
> > > In the context of the above comment, should &x on the device be an
> > > address I can verify, somehow, to make sure that it's correct or is it a
> > > completely new device address?
> > >
> > > So for example, should it be the same as when I do a use_device_ptr but
> > > print the &x in that case? (With the current master those two addresses
> > > are not the same.)
> > >
> > > I guess what I need is an example of using use_device_addr that actually
> > > does something meaningful because with the current main branch printing
> > > the &x of a use_device_addr(x) is nil.
> > When an outer map(x) is placed, &x does print something meaningful.
> > I tried to access `omp_get_mapped_ptr(&x, omp_get_default_device())` but
> > got link time error about missing omp_get_mapped_ptr definition. It seems
> > missing an implementation of this OpenMP API.
> >
> > When there is no map(x), I also got nil, I think this is a bug, &x should
> > keep the host value.
> >
> > I cannot think of a useful example with use_device_addr(x) where x is a
> > pointer. But x can be a scalar float.
> > and then call cublas gemm, the alpha/beta parameter can be &x.
> > When an outer map(x) is placed, &x does print something meaningful.
>
> For me, in the same scenario, it prints nil.
>
> Here's the full example to avoid any confusion:
>
> ```
> float *x = (float *) malloc(10*sizeof(float));
>
> #pragma omp target data map(to:x[0:10])
> {
> #pragma omp target data use_device_ptr(x)
> {
> fprintf(stderr, "line %d x: %p\n", __LINE__, x); // prints
> address 0x7f0bda400000
> }
>
> #pragma omp target data use_device_addr(x)
> {
> fprintf(stderr, "line %d x: %p\n", __LINE__, &x); // prints nil
> for me
> }
> }
> }
> ```
>
> Note that x has been mapped to the device in the following way:
> ```
> Libomptarget device 0 info: Host Ptr Target Ptr
> Libomptarget device 0 info: 0x00005578f14de020 0x00007f0bda400000
> ```
>
> What should the printed address be though?
>
> Note that the above results have been obtained with current Clang/LLVM main
> not with this patch applied.
>
> If you apply this patch and run the above code but change the &x into a x you
> get:
>
> ```
> float *x = (float *) malloc(10*sizeof(float));
>
> #pragma omp target data map(to:x[0:10])
> {
> #pragma omp target data use_device_ptr(x)
> {
> fprintf(stderr, "line %d x: %p\n", __LINE__, x); // prints
> address 0x7f0bda400000
> }
>
> #pragma omp target data use_device_addr(x)
> {
> fprintf(stderr, "line %d x: %p\n", __LINE__, x); // prints
> address 0x7f0bda400000
> }
> }
> }
> ```
> When an outer map(x) is placed, &x does print something meaningful.
> I tried to access `omp_get_mapped_ptr(&x, omp_get_default_device())` but got
> link time error about missing omp_get_mapped_ptr definition. It seems missing
> an implementation of this OpenMP API.
>
> When there is no map(x), I also got nil, I think this is a bug, &x should
> keep the host value.
>
> I cannot think of a useful example with use_device_addr(x) where x is a
> pointer. But x can be a scalar float.
> and then call cublas gemm, the alpha/beta parameter can be &x.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D133694/new/
https://reviews.llvm.org/D133694
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits