tra added inline comments.

================
Comment at: clang/include/clang/Basic/BuiltinsNVPTX.def:1057
+
+BUILTIN(__nvvm_atom_xchg_global_i, "iiD*i", "n")
+TARGET_BUILTIN(__nvvm_atom_cta_xchg_global_i, "iiD*i", "n", SM_60)
----------------
Naghasan wrote:
> tra wrote:
> > t4c1 wrote:
> > > tra wrote:
> > > > t4c1 wrote:
> > > > > tra wrote:
> > > > > > We need to figure out how address-space-specific builtins are 
> > > > > > supposed to work.
> > > > > > Right now two competing approaches.
> > > > > > 
> > > > > > This patch declares builtins with generic pointer as an argument, 
> > > > > > but, according to the test, expects to be used with the AS-specific 
> > > > > > pointer.
> > > > > > It probably does not catch a wrong-AS pointer passed as an 
> > > > > > argument, either.
> > > > > > It does happen to work, but I think it's mostly due to the fact 
> > > > > > that LLVM intrinsics are overloaded and we happen to end up 
> > > > > > addrspacecast'ing  things correctly if the builtin gets the right 
> > > > > > kind of pointer.
> > > > > > 
> > > > > > The other approach is to declare the pointer with the expected AS. 
> > > > > > E.g:
> > > > > > > TARGET_BUILTIN(__nvvm_mbarrier_init_shared, "vWi*3i", "", 
> > > > > > > AND(SM_80,PTX70))
> > > > > > 
> > > > > > IMO, this is the correct way to do it, but it is also rather 
> > > > > > inconvenient to use from CUDA code as it operates on generic 
> > > > > > pointers.
> > > > > > 
> > > > > > @jdoerfert - WDYT?
> > > > > >TARGET_BUILTIN(__nvvm_mbarrier_init_shared, "vWi*3i", "", 
> > > > > >AND(SM_80,PTX70))
> > > > > >IMO, this is the correct way to do it, but it is also rather 
> > > > > >inconvenient to use from CUDA code as it operates on generic 
> > > > > >pointers.
> > > > > 
> > > > > I tried doing this, however it is also completely unusable from 
> > > > > OpenCL code (which is our use case). Trying to use it gives you 
> > > > > errors about how casting pointers to different address spaces  - for 
> > > > > example from local to AS3 is not allowed.
> > > > Hmm. It should've worked. It would need the same explicit cast to a 
> > > > pointer in AS(3) as in your tests, but it would safeguard against 
> > > > attempts to pass it a generic pointer. E.g. 
> > > > https://godbolt.org/z/qE6oxzheM
> > > > 
> > > > Explicit casting to AS(X) for AS-specific variants is annoying, but 
> > > > it's probably unavoidable at the moment regardless of whether we 
> > > > declare the pointer argument to be AS-specific or not.  LLVM will not 
> > > > always be able to infer that a pointer is in particular AS.
> > > > Using specific AS in the declaration has a minor benefit of 
> > > > safeguarding at compile time against unintentional use of generic 
> > > > pointers.
> > > > 
> > > > Ideally we may want to convert generic variant of the builtin to 
> > > > AS-specific one, if LLVM does know the AS. We currently do this for 
> > > > loads/stores, but not for other instructions.
> > > > 
> > > Well, it does not work. See: https://godbolt.org/z/vM6bKncc4. Declaring 
> > > the pointer to be in generic AS is the only way I got it to work. If you 
> > > know a way to call a builtin declared with AS numbers in OpenCL, I am 
> > > happy to do that instead.
> > Could you help me understand how different address spaces are handled by 
> > OpenCL in clang and LLVM?
> > What exactly are `__local` or `__private` in OpenCL? Do they map to LLVM's 
> > address spaces? 
> > Clang does complain that we're trying to change AS, but I do not see AS 
> > used in the IR: https://godbolt.org/z/soajoE991
> > 
> > AFAICT what happens is:
> > * OpenCL does use explicit AS for pointers (`__local`, `__private` seem to 
> > pop up in the error messages)
> > * `__attribute__((address_space(3)))` does not match the AS of `__local` 
> > and that leads to an error.
> > * generic pointer argument works because we are allowed to cast any 
> > specific AS to generic one.
> > 
> > In other words, having specific-AS arguemt works as intended, we just have 
> > a mismatch between AS number used by OpenCL and AS number used by NVPTX and 
> > we're not allowed to cast between two specific AS.
> > 
> > If that's indeed the case, then what we appear to be missing is the mapping 
> > from OpenCL AS to the target-specific AS, which should, ideally, be done by 
> > clang itself. So, if NVPTX-specific builtin operating on shared pointer is 
> > called with a pointer in OpenCL's equivalent of CUDA's `__shared__`, it 
> > should be mapped to AS(3).
> > 
> > Could you help me understand how different address spaces are handled by 
> > OpenCL in clang and LLVM?
> 
> clang makes a strong distinction between language and target address spaces 
> since ~3.6 (was more loose before). Each target in clang defines a map 
> between language and target address space (e.g. 
> https://github.com/llvm/llvm-project/blob/main/clang/lib/Basic/Targets/SPIR.h#L25).
>  The map is used in clang codegen to lower `__local` to the right target 
> address space.
> 
> > Clang does complain that we're trying to change AS, but I do not see AS 
> > used in the IR: https://godbolt.org/z/soajoE991
> 
> Same code but targeting SPIR: https://godbolt.org/z/4E3brzodq (ARM maps all 
> languages address spaces to 0)
> 
> > having specific-AS arguemt works as intended, we just have a mismatch 
> > between AS number used by OpenCL and AS number used by NVPTX and we're not 
> > allowed to cast between two specific AS
> 
> OpenCL languages do map to nvptx target address space, it is just form 
> clang's semantic a language asp is strongly distinct from target ones (lang 
> asp simply isn't understood as a number). So you can't mix and match without 
> an explicit cast, even if the lang asp eventually lowers to that target.
> 
> What is missing is the ability for the target builtin to accept a language 
> asp if it lowers to the target asp.

> What is missing is the ability for the target builtin to accept a language 
> asp if it lowers to the target asp.

Agreed. I think this should be a sensible thing to support. 
Once it's fixed you should be able to both use AS-specific builtins w/o 
explicit pointer casts and have error checks for the wrong pointer types.



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D112718

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

Reply via email to