yaxunl marked 9 inline comments as done.
yaxunl added inline comments.
Herald added a subscriber: dang.

================
Comment at: clang/lib/AST/ASTContext.cpp:10068
+        isa<VarDecl>(D) && cast<VarDecl>(D)->isFileVarDecl() &&
+        cast<VarDecl>(D)->getStorageClass() == SC_Static) {
+      return GVA_StrongExternal;
----------------
JonChesterfield wrote:
> yaxunl wrote:
> > rjmccall wrote:
> > > Are you sure this doesn't apply to e.g. local statics?  Can't you have 
> > > kernel lambdas, or am I confusing HIP with another language?
> > function-scope static var in a device function is only visible to the 
> > device function. Host code cannot access it, therefore no need to 
> > externalize it.
> This doesn't sound right. An inline function can return a pointer to a 
> function scope static variable, e.g. to implement a singleton in a header 
> file.  I think host code can then access said variable.
As long as we are not accessing the static variable by symbol we do not need 
externalize it.

If a device function returns a pointer to its static variable and somehow 
passes that pointer to host code, the host code can use it directly by 
hipMemCpy.


================
Comment at: clang/lib/AST/ASTContext.cpp:10068
+        isa<VarDecl>(D) && cast<VarDecl>(D)->isFileVarDecl() &&
+        cast<VarDecl>(D)->getStorageClass() == SC_Static) {
+      return GVA_StrongExternal;
----------------
rjmccall wrote:
> yaxunl wrote:
> > JonChesterfield wrote:
> > > yaxunl wrote:
> > > > rjmccall wrote:
> > > > > Are you sure this doesn't apply to e.g. local statics?  Can't you 
> > > > > have kernel lambdas, or am I confusing HIP with another language?
> > > > function-scope static var in a device function is only visible to the 
> > > > device function. Host code cannot access it, therefore no need to 
> > > > externalize it.
> > > This doesn't sound right. An inline function can return a pointer to a 
> > > function scope static variable, e.g. to implement a singleton in a header 
> > > file.  I think host code can then access said variable.
> > As long as we are not accessing the static variable by symbol we do not 
> > need externalize it.
> > 
> > If a device function returns a pointer to its static variable and somehow 
> > passes that pointer to host code, the host code can use it directly by 
> > hipMemCpy.
> Right, and IIRC you can declare __host__ __device__ functions as well, which 
> ought to agree on the variable if they agree on globals.
If we have a static variable in a device function, it is only visible in the 
function and not visible by any host code. We only need externalize it if it 
needs to be accessed `by symbol` in the host code, however, that is impossible, 
therefore we do not need externalize it.

For static variables in a host device function, the static variables should be 
different instances on host side and device side. The rationale is that a 
static variable is per function, whereas a host device function is actually two 
functions: a host instance and a device instance, which could be totally 
different by using conditional macros. If it is requested that the static 
variable in a host device function is one instance, it requires special 
handling in runtime so that the same variable can be accessed on both device 
side and host side by common load/store instructions, but that is not the case. 
Therefore the device side instance of a static variable in a host device 
function is still only visible to device codes, not visible to host codes. 
Since it cannot be accessed `by symbol` by host code, it does not needs to be 
externalized.
 


================
Comment at: clang/lib/CodeGen/CodeGenModule.cpp:6069
+    llvm::raw_ostream &OS) const {
+  OS << ".static." << getLangOpts().CUID;
+}
----------------
tra wrote:
> I suspect that will have interesting issues if CUID is an arbitrary 
> user-supplied string. We may want to impose some sort of sanity check or 
> filtering on the cuid value. Considering that it's a CC1 flag, it's not a 
> critical problem, but some safeguards would be useful there, too. Should we 
> limit allowed character set?
will only allow alphanumeric and underscore in CUID for simplicity.


================
Comment at: clang/test/Driver/hip-cuid.hip:35
+// RUN:   --offload-arch=gfx906 \
+// RUN:   -c -nogpulib -cuid=abcd \
+// RUN:   %S/Inputs/hip_multiple_inputs/a.cu \
----------------
tra wrote:
> Nit: `abcd` could potentially match the value generated by hash. I'd change 
> it to contain characters other than hex.
done


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

https://reviews.llvm.org/D80858



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

Reply via email to