r248433 - [CUDA] Added CUDA installation detector class.

Artem Belevich via cfe-commits cfe-commits at lists.llvm.org
Wed Sep 23 17:14:45 PDT 2015


Interesting. So it's sysroot option that's somehow to blame.
--cuda-path=<long path> works.

I'll disable part of the test that uses sysroot for now and will submit a
proper fix once I figure it out.

--Artem

On Wed, Sep 23, 2015 at 5:07 PM, Rui Ueyama <ruiu at google.com> wrote:

> I don't know the exact condition, but here's my results.
>
> OK
>
> $ bin/clang -v -target=i386-unknown-linux
> --sysroot=/tmp/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/CUDA
> clang-3.7: error: unknown argument: '-target=i386-unknown-linux'
> clang version 3.8.0 (http://llvm.org/git/clang.git
> 261b6512ccd334c6fc80d0d254a98627b053b07d) (llvm/trunk 248446)
> Target: x86_64-unknown-linux-gnu
> Thread model: posix
> InstalledDir: /ssd/build/bin
> Found CUDA installation:
> /tmp/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/CUDA/usr/local/cuda
>
> NG
>
> $ bin/clang -v -target=i386-unknown-linux
> --sysroot=/tmp/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/CUDA
> clang-3.7: error: unknown argument: '-target=i386-unknown-linux'
> clang version 3.8.0 (http://llvm.org/git/clang.git
> 261b6512ccd334c6fc80d0d254a98627b053b07d) (llvm/trunk 248446)
> Target: x86_64-unknown-linux-gnu
> Thread model: posix
> InstalledDir: /ssd/build/bin
>
> (no "Found CUDA installation")
>
> On Wed, Sep 23, 2015 at 5:00 PM, Artem Belevich <tra at google.com> wrote:
>
>> How long is very long? I've tested on ubuntu with ~1600-character-long
>> path and it works.
>>
>> Buildbot filed with a much shorter path:
>>
>> http://lab.llvm.org:8080/green/job/clang-stage1-cmake-RA_check/7416/consoleFull#-1841136826a1ca8a51-895e-46c6-af87-ce24fa4cd561
>>
>> I'll unroll my change if I fail to figure out how to fix it shortly.
>>
>> --Artem
>>
>>
>> On Wed, Sep 23, 2015 at 4:51 PM, Rui Ueyama <ruiu at google.com> wrote:
>>
>>> Yes I can. Create a deep nested directly, create a symlink from there to
>>> your Inputs/CUDA, and run "clang -v --target=i386-unknown-linux
>>> --sysroot=<very long directory>/Inputs/CUDA".
>>>
>>> On Wed, Sep 23, 2015 at 4:47 PM, Artem Belevich <tra at google.com> wrote:
>>>
>>>> I'm looking into it. Can you reproduce it on linux?
>>>>
>>>>
>>>> On Wed, Sep 23, 2015 at 4:43 PM, Rui Ueyama <ruiu at google.com> wrote:
>>>>
>>>>> 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?
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> --Artem Belevich
>>>>
>>>
>>>
>>
>>
>> --
>> --Artem Belevich
>>
>
>


-- 
--Artem Belevich
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150923/4d552767/attachment-0001.html>


More information about the cfe-commits mailing list