tambre created this revision.
tambre added reviewers: tra, jlebar.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
tambre added inline comments.


================
Comment at: clang/lib/Driver/Driver.cpp:642
+              *this, CudaTriple, *HostTC, C.getInputArgs(), OFK);
+      C.getArgs().AddJoinedArg(
+          nullptr, getOpts().getOption(options::OPT_cuda_version_EQ),
----------------
This isn't very pretty. Any better ideas for how to pass the current CUDA 
version or default arch to `CudaActionBuilder`?


Currently always defaults to sm_20.
However, CUDA >=9.0 doesn't support the sm_20 architecture.
Choose the minimum architecture the CUDA installation supports as the default.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D75811

Files:
  clang/include/clang/Basic/Cuda.h
  clang/include/clang/Driver/Options.td
  clang/lib/Basic/Cuda.cpp
  clang/lib/Driver/Driver.cpp
  clang/lib/Driver/ToolChains/Cuda.cpp
  clang/lib/Driver/ToolChains/Cuda.h

Index: clang/lib/Driver/ToolChains/Cuda.h
===================================================================
--- clang/lib/Driver/ToolChains/Cuda.h
+++ clang/lib/Driver/ToolChains/Cuda.h
@@ -188,6 +188,7 @@
                      const llvm::opt::ArgList &Args) const override;
 
   unsigned GetDefaultDwarfVersion() const override { return 2; }
+  CudaVersion getCudaVersion() const;
 
   const ToolChain &HostTC;
   CudaInstallationDetector CudaInstallation;
Index: clang/lib/Driver/ToolChains/Cuda.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Cuda.cpp
+++ clang/lib/Driver/ToolChains/Cuda.cpp
@@ -884,3 +884,7 @@
                                                const ArgList &Args) const {
   return HostTC.computeMSVCVersion(D, Args);
 }
+
+CudaVersion CudaToolChain::getCudaVersion() const {
+  return CudaInstallation.version();
+}
Index: clang/lib/Driver/Driver.cpp
===================================================================
--- clang/lib/Driver/Driver.cpp
+++ clang/lib/Driver/Driver.cpp
@@ -634,12 +634,17 @@
     llvm::Triple CudaTriple(DeviceTripleStr);
     // Use the CUDA and host triples as the key into the ToolChains map,
     // because the device toolchain we create depends on both.
-    auto &CudaTC = ToolChains[CudaTriple.str() + "/" + HostTriple.str()];
-    if (!CudaTC) {
-      CudaTC = std::make_unique<toolchains::CudaToolChain>(
-          *this, CudaTriple, *HostTC, C.getInputArgs(), OFK);
+    auto &Toolchain = ToolChains[CudaTriple.str() + "/" + HostTriple.str()];
+    if (!Toolchain) {
+      std::unique_ptr<toolchains::CudaToolChain> CudaTC =
+          std::make_unique<toolchains::CudaToolChain>(
+              *this, CudaTriple, *HostTC, C.getInputArgs(), OFK);
+      C.getArgs().AddJoinedArg(
+          nullptr, getOpts().getOption(options::OPT_cuda_version_EQ),
+          CudaVersionToString(CudaTC->getCudaVersion()));
+      Toolchain = std::move(CudaTC);
     }
-    C.addOffloadDeviceToolChain(CudaTC.get(), OFK);
+    C.addOffloadDeviceToolChain(Toolchain.get(), OFK);
   } else if (IsHIP) {
     const ToolChain *HostTC = C.getSingleOffloadToolChain<Action::OFK_Host>();
     const llvm::Triple &HostTriple = HostTC->getTriple();
@@ -2566,7 +2571,16 @@
     CudaActionBuilder(Compilation &C, DerivedArgList &Args,
                       const Driver::InputList &Inputs)
         : CudaActionBuilderBase(C, Args, Inputs, Action::OFK_Cuda) {
-      DefaultCudaArch = CudaArch::SM_20;
+      StringRef VersionString =
+          Args.getLastArgValue(options::OPT_cuda_version_EQ);
+      CudaVersion Version = CudaStringToVersion(VersionString);
+
+      if (Version == CudaVersion::UNKNOWN) {
+        C.getDriver().Diag(clang::diag::err_drv_cuda_unknown_version)
+            << VersionString;
+      }
+
+      DefaultCudaArch = MinArchForCudaVersion(Version);
     }
 
     ActionBuilderReturnCode
Index: clang/lib/Basic/Cuda.cpp
===================================================================
--- clang/lib/Basic/Cuda.cpp
+++ clang/lib/Basic/Cuda.cpp
@@ -362,6 +362,14 @@
   }
 }
 
+CudaArch MinArchForCudaVersion(CudaVersion V) {
+  if (V >= CudaVersion::CUDA_90) {
+    return CudaArch::SM_30;
+  } else {
+    return CudaArch::SM_20;
+  }
+}
+
 static CudaVersion ToCudaVersion(llvm::VersionTuple Version) {
   int IVer =
       Version.getMajor() * 10 + Version.getMinor().getValueOr(0);
Index: clang/include/clang/Driver/Options.td
===================================================================
--- clang/include/clang/Driver/Options.td
+++ clang/include/clang/Driver/Options.td
@@ -563,6 +563,9 @@
 def cuda_compile_host_device : Flag<["--"], "cuda-compile-host-device">,
   HelpText<"Compile CUDA code for both host and device (default).  Has no "
            "effect on non-CUDA compilations.">;
+def cuda_version_EQ : Joined<["--"], "cuda-version=">, Flags<[DriverOption]>,
+  MetaVarName<"<version>">, Values<"<major>.<minor>">,
+  HelpText<"Used to choose default architecture if no other options are given.">;
 def cuda_include_ptx_EQ : Joined<["--"], "cuda-include-ptx=">, Flags<[DriverOption]>,
   HelpText<"Include PTX for the following GPU architecture (e.g. sm_35) or 'all'. May be specified more than once.">;
 def no_cuda_include_ptx_EQ : Joined<["--"], "no-cuda-include-ptx=">, Flags<[DriverOption]>,
Index: clang/include/clang/Basic/Cuda.h
===================================================================
--- clang/include/clang/Basic/Cuda.h
+++ clang/include/clang/Basic/Cuda.h
@@ -109,6 +109,9 @@
 /// Get the latest CudaVersion that supports the given CudaArch.
 CudaVersion MaxVersionForCudaArch(CudaArch A);
 
+/// Get the minimum CudaArch supported by the given CudaVersion.
+CudaArch MinArchForCudaVersion(CudaVersion V);
+
 //  Various SDK-dependent features that affect CUDA compilation
 enum class CudaFeature {
   // CUDA-9.2+ uses a new API for launching kernels.
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to