r248433 - [CUDA] Added CUDA installation detector class.

Rui Ueyama via cfe-commits cfe-commits at lists.llvm.org
Wed Sep 23 16:43:01 PDT 2015


On Wed, Sep 23, 2015 at 2:49 PM, Artem Belevich via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: tra
> Date: Wed Sep 23 16:49:39 2015
> New Revision: 248433
>
> URL: http://llvm.org/viewvc/llvm-project?rev=248433&view=rev
> Log:
> [CUDA] Added CUDA installation detector class.
>
> Added new option --cuda-path=<path> which allows
> overriding default search paths.
> If it's not specified we look for CUDA installation in
> /usr/include/cuda and /usr/include/cuda-7.0.
>
> Differential Revision: http://reviews.llvm.org/D12989
>
> Added:
>     cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/include/.keep
>     cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/lib/.keep
>     cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/lib64/.keep
>     cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/nvvm/libdevice/.keep
>     cfe/trunk/test/Driver/cuda-detect.cu
> Modified:
>     cfe/trunk/include/clang/Driver/Options.td
>     cfe/trunk/lib/Driver/ToolChains.cpp
>     cfe/trunk/lib/Driver/ToolChains.h
>
> Modified: cfe/trunk/include/clang/Driver/Options.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=248433&r1=248432&r2=248433&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Driver/Options.td (original)
> +++ cfe/trunk/include/clang/Driver/Options.td Wed Sep 23 16:49:39 2015
> @@ -359,6 +359,8 @@ def cuda_gpu_arch_EQ : Joined<["--"], "c
>    Flags<[DriverOption, HelpHidden]>, HelpText<"CUDA GPU architecture">;
>  def cuda_host_only : Flag<["--"], "cuda-host-only">,
>    HelpText<"Do host-side CUDA compilation only">;
> +def cuda_path_EQ : Joined<["--"], "cuda-path=">, Group<i_Group>,
> +  HelpText<"CUDA installation path">;
>  def dA : Flag<["-"], "dA">, Group<d_Group>;
>  def dD : Flag<["-"], "dD">, Group<d_Group>, Flags<[CC1Option]>,
>    HelpText<"Print macro definitions in -E mode in addition to normal
> output">;
>
> Modified: cfe/trunk/lib/Driver/ToolChains.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=248433&r1=248432&r2=248433&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Driver/ToolChains.cpp (original)
> +++ cfe/trunk/lib/Driver/ToolChains.cpp Wed Sep 23 16:49:39 2015
> @@ -1482,6 +1482,48 @@ bool Generic_GCC::GCCInstallationDetecto
>      BiarchTripleAliases.push_back(BiarchTriple.str());
>  }
>
> +// \brief -- try common CUDA installation paths looking for files we need
> for
> +// CUDA compilation.
> +
> +void
> +Generic_GCC::CudaInstallationDetector::init(const Driver &D,
> +                                            const llvm::Triple
> &TargetTriple,
> +                                            const llvm::opt::ArgList
> &Args) {
> +  SmallVector<StringRef, 4> CudaPathCandidates;
> +
> +  if (Args.hasArg(options::OPT_cuda_path_EQ))
> +    CudaPathCandidates.push_back(
> +        Args.getLastArgValue(options::OPT_cuda_path_EQ));
> +  else {
> +    CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda");
> +    CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
> +  }
> +
> +  for (const auto CudaPath : CudaPathCandidates) {
> +    if (CudaPath.empty() || !llvm::sys::fs::exists(CudaPath))
> +      continue;
> +
> +    CudaInstallPath = CudaPath;
> +    CudaIncludePath = CudaInstallPath + "/include";
> +    CudaLibDevicePath = CudaInstallPath + "/nvvm/libdevice";
> +    CudaLibPath =
> +        CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" :
> "/lib");
> +
> +    if (!(llvm::sys::fs::exists(CudaIncludePath) &&
> +          llvm::sys::fs::exists(CudaLibPath) &&
> +          llvm::sys::fs::exists(CudaLibDevicePath)))
> +      continue;
> +
> +    IsValid = true;
> +    break;
> +  }
> +}
> +
> +void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
> +  if (isValid())
> +    OS << "Found CUDA installation: " << CudaInstallPath << "\n";
> +}
> +
>  namespace {
>  // Filter to remove Multilibs that don't exist as a suffix to Path
>  class FilterNonExistent {
> @@ -2053,7 +2095,7 @@ void Generic_GCC::GCCInstallationDetecto
>
>  Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
>                           const ArgList &Args)
> -    : ToolChain(D, Triple, Args), GCCInstallation() {
> +    : ToolChain(D, Triple, Args), GCCInstallation(), CudaInstallation() {
>    getProgramPaths().push_back(getDriver().getInstalledDir());
>    if (getDriver().getInstalledDir() != getDriver().Dir)
>      getProgramPaths().push_back(getDriver().Dir);
> @@ -2085,6 +2127,7 @@ Tool *Generic_GCC::buildLinker() const {
>  void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
>    // Print the information about how we detected the GCC installation.
>    GCCInstallation.print(OS);
> +  CudaInstallation.print(OS);
>  }
>
>  bool Generic_GCC::IsUnwindTablesDefault() const {
> @@ -3261,6 +3304,7 @@ static StringRef getOSLibDir(const llvm:
>  Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList
> &Args)
>      : Generic_ELF(D, Triple, Args) {
>    GCCInstallation.init(D, Triple, Args);
> +  CudaInstallation.init(D, Triple, Args);
>    Multilibs = GCCInstallation.getMultilibs();
>    llvm::Triple::ArchType Arch = Triple.getArch();
>    std::string SysRoot = computeSysRoot();
>
> Modified: cfe/trunk/lib/Driver/ToolChains.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.h?rev=248433&r1=248432&r2=248433&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Driver/ToolChains.h (original)
> +++ cfe/trunk/lib/Driver/ToolChains.h Wed Sep 23 16:49:39 2015
> @@ -157,6 +157,38 @@ public:
>  protected:
>    GCCInstallationDetector GCCInstallation;
>
> +  // \brief A class to find a viable CUDA installation
> +
> +  class CudaInstallationDetector {
> +    bool IsValid;
> +    std::string CudaInstallPath;
> +    std::string CudaLibPath;
> +    std::string CudaLibDevicePath;
> +    std::string CudaIncludePath;
> +
> +  public:
> +    CudaInstallationDetector() : IsValid(false) {}
> +    void init(const Driver &D, const llvm::Triple &TargetTriple,
> +              const llvm::opt::ArgList &Args);
> +
> +    /// \brief Check whether we detected a valid Cuda install.
> +    bool isValid() const { return IsValid; }
> +    /// \brief Print information about the detected CUDA installation.
> +    void print(raw_ostream &OS) const;
> +
> +    /// \brief Get the detected Cuda installation path.
> +    StringRef getInstallPath() const { return CudaInstallPath; }
> +    /// \brief Get the detected Cuda Include path.
> +    StringRef getIncludePath() const { return CudaIncludePath; }
> +    /// \brief Get the detected Cuda library path.
> +    StringRef getLibPath() const { return CudaLibPath; }
> +    /// \brief Get the detected Cuda device library path.
> +    StringRef getLibDevicePath() const { return CudaLibDevicePath; }
> +    /// \brief Get libdevice file for given architecture
> +  };
> +
> +  CudaInstallationDetector CudaInstallation;
> +
>  public:
>    Generic_GCC(const Driver &D, const llvm::Triple &Triple,
>                const llvm::opt::ArgList &Args);
>
> Added: cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/include/.keep
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/include/.keep?rev=248433&view=auto
>
> ==============================================================================
>     (empty)
>
> Added: cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/lib/.keep
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/lib/.keep?rev=248433&view=auto
>
> ==============================================================================
>     (empty)
>
> Added: cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/lib64/.keep
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/lib64/.keep?rev=248433&view=auto
>
> ==============================================================================
>     (empty)
>
> Added:
> cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/nvvm/libdevice/.keep
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/nvvm/libdevice/.keep?rev=248433&view=auto
>
> ==============================================================================
>     (empty)
>
> Added: cfe/trunk/test/Driver/cuda-detect.cu
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/cuda-detect.cu?rev=248433&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/Driver/cuda-detect.cu (added)
> +++ cfe/trunk/test/Driver/cuda-detect.cu Wed Sep 23 16:49:39 2015
> @@ -0,0 +1,12 @@
> +// REQUIRES: clang-driver
> +// REQUIRES: x86-registered-target
> +//
> +// RUN: %clang -v --target=i386-unknown-linux \
> +// RUN:   --sysroot=/tmp/no-cuda-there 2>&1 | FileCheck %s -check-prefix
> NOCUDA
> +// RUN: %clang -v --target=i386-unknown-linux \
> +// RUN:   --sysroot=%S/Inputs/CUDA 2>&1 | FileCheck %s
> +// RUN: %clang -v --target=i386-unknown-linux \
> +// RUN:   --cuda-path=%S/Inputs/CUDA/usr/local/cuda 2>&1 | FileCheck %s
> +
> +// CHECK: Found CUDA installation: {{.*}}/Inputs/CUDA/usr/local/cuda
> +// NOCUDA-NOT: Found CUDA installation:
>

This test seems to fail on Linux if the full path to Inputs directory is
very long because it fails to detect the cuda installation path. Can you
take a look?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150923/255443c4/attachment-0001.html>


More information about the cfe-commits mailing list