Anastasia added inline comments.
================ Comment at: clang/include/clang/Basic/OpenCLOptions.h:51 + // check specific version of feature) + void supportFeatureForPreOCL30(StringRef Feat, bool On = true) { + assert(CLVer < 300 && "Can'be called for OpenCL C higher 3.0"); ---------------- azabaznov wrote: > Anastasia wrote: > > azabaznov wrote: > > > Anastasia wrote: > > > > I find the name of this function very confusing but I can't think of > > > > any better one. Also the flow is becoming harder to understand to be > > > > honest. This function is not as straight forward as `support` because > > > > it might not actually do what is expected from it. I wonder if the name > > > > with something like `adjust` would be more appropriate. At the same > > > > time `adjustFeatures` is the only place where we need to check for the > > > > version. Perhaps you can just do the language version check straight in > > > > `adjustFeatures`? > > > > > > > > Overall, let's just get clear about the flow of setting the features > > > > and extensions. If in `adjustFeatures` we set default features > > > > supported in a certain language version then targets can set the other > > > > features. Now let's examine what should happen with the features and > > > > extensions on the following use cases: > > > > - Do we always set the equivalent extension when the feature is being > > > > set by the target? > > > > - Do we always set the equivalent feature when the extension is being > > > > set by the target? > > > > - What happens when equivalent features and extensions are set but to > > > > different values? > > > > - What if targets set core feature/extension to unsupported? > > > > - How does `-cl-ext` modify core features/extensions and equivalent > > > > features+extensions? > > > > > > > > I am a bit worried about the fact that we have different items for the > > > > same optional functionality in `OpenCLOptions` as it might be a > > > > nightmare to keep them consistent. We can however also choose a path of > > > > not keeping them consistent in the common code and rely on targets to > > > > set them up correctly. > > > > > > > > Initially, when we discussed adding feature macros to earlier standards > > > > I was thinking of simplifying the design. For example instead of > > > > checking for extension macros and feature macros in the header when > > > > declaring certain functions we could only check for one of those. The > > > > question whether we can really achieve the simplifications and at what > > > > cost. > > > Ok. > > > > > > Now I think that defining features for pre-OpenCL C 3.0 if they have > > > equivalent extension indeed brings up some complexities. The check for > > > the support of features in header will still look like follows: > > > > > > ``` > > > #if defined(cl_khr_fp64) || defined(__opencl_c_fp64) > > > ... > > > #endif > > > ``` > > > > > > so there is no need to add a feature macro for pre-OpenCL C 3.0 if there > > > is a same extension to check. Are you agree with that? > > > > > > However, I still see a reason for defining equivalent extension for > > > OpenCL C 3.0 if feature is supported (backward compatibility with earlier > > > OpenCL C kernels). > > > > > > > Overall, let's just get clear about the flow of setting the features > > > > and extensions > > > IMO the main thing which we need to try to follow here is that features > > > are stronger concept than extensions in OpenCL C 3.0. The reason for this > > > is that API won't report extension support if the feature is not > > > supported ([[ > > > https://www.khronos.org/registry/OpenCL/specs/3.0-unified/html/OpenCL_API.html#_3d_image_writes > > > | 3d image writes example]]. To be clear, if users need to support > > > functionality in OpenCL C 3.0 they should use features, for earlier > > > versions they should use extensions. > > > > > > Answering your questions: > > > > > > > Do we always set the equivalent extension when the feature is being set > > > > by the target? > > > I think we should do it for OpenCL C 3.0 only to maintain backward > > > compatibility with OpenCL C 1.2 applications. > > > > > > > Do we always set the equivalent feature when the extension is being set > > > > by the target > > > I think we shouldn't set equivalent feature for pre-OpenCL C 3.0 since > > > there is no need in that. This brings up some complexities, and we can > > > check an extension presence. > > > > > > > What happens when equivalent features and extensions are set but to > > > > different values > > > We need to avoid that case for OpenCL C 3.0 since implementation could > > > not report extension support if equivalent feature is not supported. > > > > > > > How does -cl-ext modify core features/extensions and equivalent > > > > features+extensions > > > '-сl-ext' should not affect feature support in pre-OpenCL 3.0. In OpenCL > > > C 3.0 it's more likely to use features instead of extensions since it's a > > > stronger concept; and equivalent feature+extension will be supported > > > simultaneously if feature is turned on. > > > > > > And a question: > > > > > > > What if targets set core feature/extension to unsupported? > > > Not sure what do you mean about //core// here. What do you mean? But I > > > don't think this will cause a problem if we will follow up the rules that > > > I described above. Do you see any? > > > Now I think that defining features for pre-OpenCL C 3.0 if they have > > > equivalent extension indeed brings up some complexities. The check for > > > the support of features in header will still look like follows: > > > > > > #if defined(cl_khr_fp64) || defined(__opencl_c_fp64) > > > ... > > > #endif > > > > > > so there is no need to add a feature macro for pre-OpenCL C 3.0 if there > > > is a same extension to check. Are you agree with that? > > > > Yes, we could still simplify the headers by adding the feature macros > > directly there: > > > > ``` > > #if defined(cl_khr_fp64) > > #define __opencl_c_fp64 1 > > #endif > > ... > > #if defined(__opencl_c_fp64) > > double cos(double); > > ... > > #endif > > ``` > > > > > > > > > Answering your questions: > > > > > > Do we always set the equivalent extension when the feature is being > > > set by the target? > > > > > > I think we should do it for OpenCL C 3.0 only to maintain backward > > > compatibility with OpenCL C 1.2 applications. > > > > > > Do we always set the equivalent feature when the extension is being > > > set by the target > > > > > > I think we shouldn't set equivalent feature for pre-OpenCL C 3.0 since > > > there is no need in that. This brings up some complexities, and we can > > > check an extension presence. > > > > > > What happens when equivalent features and extensions are set but to > > > different values > > > > > > We need to avoid that case for OpenCL C 3.0 since implementation could > > > not report extension support if equivalent feature is not supported. > > > > > > How does -cl-ext modify core features/extensions and equivalent > > > features+extensions > > > > > > '-сl-ext' should not affect feature support in pre-OpenCL 3.0. In OpenCL > > > C 3.0 it's more likely to use features instead of extensions since it's a > > > stronger concept; and equivalent feature+extension will be supported > > > simultaneously if feature is turned on. > > > > Ok, this all makes sense. The only question is whether you plan to keep > > coherency between corresponding features and extensions **automatically** > > or it has to be done **manually** i.e. targets would be responsible to > > provide the setup consistently and the same applies to values set in > > `-cl-ext ` e.g. if it has `+cl_khr_fp64` then it should also have > > `+__opencl_c_fp64`. The advantage of doing it automatically is that it > > reduces the risks of errors, but it might become complicated to implement > > and test all possible combinations. > > > > > > > > What if targets set core feature/extension to unsupported? > > > > > > Not sure what do you mean about core here. What do you mean? But I don't > > > think this will cause a problem if we will follow up the rules that I > > > described above. Do you see any? > > > > I think right now it only applies to extensions actually. What I mean is if > > a target sets the extension which is core to unsupported, but I think this > > was intended to be allowed... it is not explicitly explained in the spec. > > > > Ok, this all makes sense. The only question is whether you plan to keep > > coherency between corresponding features and extensions automatically or it > > has to be done manually > > I think it's possible to handle these in our `OpenCLOptions`, e.g. > automatically. This will release targets from obligations to take of this > simultaneous setting: each target will need to duplicate this (introduce > helper...?). For now I think it's possible to reuse `setSupportedOpenCLOpt` > for extensions and features. > > > I think right now it only applies to extensions actually. What I mean is if > > a target sets the extension which is core to unsupported > > This shouldn't affect anything if feature unsupported. Just to double check, > you mean target calls: > > ``` > support("-cl_khr_fp64"); > support("+__opencl_c_fp64"); > ``` > > As I see it compiler should define both macros both for OpenCL C 3.0 and > nothing for fp64 in earlier versions. > > P.S. actually I didn't find something similar about fp64 as for [[ > https://www.khronos.org/registry/OpenCL/specs/3.0-unified/html/OpenCL_API.html#_3d_image_writes| > 3d images ]] in API reports. I'm wondering if spec is missing that for fp64, > or is something similar to subgroups, and extension/feature are not the > same.... > > > P.S. actually I didn't find something similar about fp64 as for 3d images in > API reports. I'm wondering if spec is missing that for fp64, or is something > similar to subgroups, and extension/feature are not the same.... Yes, potentially we need to brush up the spec a bit more for extensions and features that are inherited from extensions. I find the spec very inconsistent. In some cases it is not even clear what extensions even mean. Here is one example: https://www.khronos.org/registry/OpenCL/sdk/2.2/docs/man/html/cl_khr_depth_images.html Not sure what's the best approach as it's a lot of work. Potentially we should create spec issues as we go along with the implementation. I think perhaps we should expand section 6.2.2. to at least explain what the optional core extension actually means? CHANGES SINCE LAST ACTION https://reviews.llvm.org/D89869/new/ https://reviews.llvm.org/D89869 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits