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