HIP
HIP copied to clipboard
`hipcc` disregards the `--gcc-toolchain` option
Comparing the behaviour of various builds of clang, it looks like hipcc and the version of clang coming with HIP fail to make use of the --gcc-toolchain option.
To better illustrate what I mean, here is a comparison of the behaviour of different builds of clang:
- clang 14.0.0 from CentOS 8 Stream
- clang 12.0.1 from a private build
- clang 14.0.0 from HIP/ROCm 5.0.2
- hipcc 5.0.13601 / AMD clang version 14.0.0 from HIP/ROCm 5.0.2
common
$ alias format="sed -e's/=/=\n /g' -e's/:\//\n \//g'"
$ TOOLCHAIN=/cvmfs/cms.cern.ch/el8_amd64_gcc12/external/gcc/12.1.1-bf4aef5069fdf6bb6f77f897bcc8a6ae
$ $TOOLCHAIN/bin/g++ --version
g++ (GCC) 12.1.1 20220516
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
clang 14.0.0 from CentOS 8 Stream
$ /usr/bin/clang++ --version
clang version 14.0.0 (Red Hat 14.0.0-1.module_el8.7.0+1142+5343df54)
Target: x86_64-redhat-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
$ /usr/bin/clang++ --print-search-dirs | format
programs: =
/usr/bin
/usr/bin/../lib/gcc/x86_64-redhat-linux/8/../../../../x86_64-redhat-linux/bin
libraries: =
/usr/lib64/clang/14.0.0
/usr/bin/../lib/gcc/x86_64-redhat-linux/8
/usr/bin/../lib/gcc/x86_64-redhat-linux/8/../../../../lib64
/lib/../lib64
/usr/lib/../lib64
/usr/bin/../lib
/usr/bin/../lib64
/lib
/usr/lib
$ /usr/bin/clang++ --print-search-dirs --gcc-toolchain=$TOOLCHAIN | format
programs: =
/usr/bin
/cvmfs/cms.cern.ch/el8_amd64_gcc12/external/gcc/12.1.1-bf4aef5069fdf6bb6f77f897bcc8a6ae/lib/gcc/x86_64-redhat-linux-gnu/12.1.1/../../../../x86_64-redhat-linux-gnu/bin
libraries: =
/usr/lib64/clang/14.0.0
/cvmfs/cms.cern.ch/el8_amd64_gcc12/external/gcc/12.1.1-bf4aef5069fdf6bb6f77f897bcc8a6ae/lib/gcc/x86_64-redhat-linux-gnu/12.1.1
/cvmfs/cms.cern.ch/el8_amd64_gcc12/external/gcc/12.1.1-bf4aef5069fdf6bb6f77f897bcc8a6ae/lib/gcc/x86_64-redhat-linux-gnu/12.1.1/../../../../lib64
/lib/../lib64
/usr/lib/../lib64
/cvmfs/cms.cern.ch/el8_amd64_gcc12/external/gcc/12.1.1-bf4aef5069fdf6bb6f77f897bcc8a6ae/lib/gcc/x86_64-redhat-linux-gnu/12.1.1/../../../../x86_64-redhat-linux-gnu/lib
/usr/bin/../lib
/usr/bin/../lib64
/lib
/usr/lib
clang 12.0.1 from a private build
$ source /cvmfs/cms.cern.ch/el8_amd64_gcc12/external/llvm/12.0.1-a100c412676d03d68415d6def72fe659/etc/profile.d/init.sh
$ /cvmfs/cms.cern.ch/el8_amd64_gcc12/external/llvm/12.0.1-a100c412676d03d68415d6def72fe659/bin/clang++ --version
clang version 12.0.1
Target: x86_64-redhat-linux-gnu
Thread model: posix
InstalledDir: /cvmfs/cms.cern.ch/el8_amd64_gcc12/external/llvm/12.0.1-a100c412676d03d68415d6def72fe659/bin
$ /cvmfs/cms.cern.ch/el8_amd64_gcc12/external/llvm/12.0.1-a100c412676d03d68415d6def72fe659/bin/clang++ --print-search-dirs | format
programs: =
/cvmfs/cms.cern.ch/el8_amd64_gcc12/external/llvm/12.0.1-a100c412676d03d68415d6def72fe659/bin
/usr/lib/gcc/x86_64-redhat-linux/8/../../../../x86_64-redhat-linux/bin
libraries: =
/cvmfs/cms.cern.ch/el8_amd64_gcc12/external/llvm/12.0.1-a100c412676d03d68415d6def72fe659/lib64/clang/12.0.1
/usr/lib/gcc/x86_64-redhat-linux/8
/usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64
/cvmfs/cms.cern.ch/el8_amd64_gcc12/external/llvm/12.0.1-a100c412676d03d68415d6def72fe659/bin/../lib64
/lib/../lib64
/usr/lib/../lib64
/usr/lib/gcc/x86_64-redhat-linux/8/../../..
/lib
/usr/lib
$ /cvmfs/cms.cern.ch/el8_amd64_gcc12/external/llvm/12.0.1-a100c412676d03d68415d6def72fe659/bin/clang++ --print-search-dirs --gcc-toolchain=$TOOLCHAIN | format
programs: =
/cvmfs/cms.cern.ch/el8_amd64_gcc12/external/llvm/12.0.1-a100c412676d03d68415d6def72fe659/bin
/cvmfs/cms.cern.ch/el8_amd64_gcc12/external/gcc/12.1.1-bf4aef5069fdf6bb6f77f897bcc8a6ae/lib/gcc/x86_64-redhat-linux-gnu/12.1.1/../../../../x86_64-redhat-linux-gnu/bin
libraries: =
/cvmfs/cms.cern.ch/el8_amd64_gcc12/external/llvm/12.0.1-a100c412676d03d68415d6def72fe659/lib64/clang/12.0.1
/cvmfs/cms.cern.ch/el8_amd64_gcc12/external/gcc/12.1.1-bf4aef5069fdf6bb6f77f897bcc8a6ae/lib/gcc/x86_64-redhat-linux-gnu/12.1.1
/cvmfs/cms.cern.ch/el8_amd64_gcc12/external/gcc/12.1.1-bf4aef5069fdf6bb6f77f897bcc8a6ae/lib/gcc/x86_64-redhat-linux-gnu/12.1.1/../../../../lib64
/cvmfs/cms.cern.ch/el8_amd64_gcc12/external/llvm/12.0.1-a100c412676d03d68415d6def72fe659/bin/../lib64
/lib/../lib64
/usr/lib/../lib64
/cvmfs/cms.cern.ch/el8_amd64_gcc12/external/gcc/12.1.1-bf4aef5069fdf6bb6f77f897bcc8a6ae/lib/gcc/x86_64-redhat-linux-gnu/12.1.1/../../../../x86_64-redhat-linux-gnu/lib
/cvmfs/cms.cern.ch/el8_amd64_gcc12/external/gcc/12.1.1-bf4aef5069fdf6bb6f77f897bcc8a6ae/lib/gcc/x86_64-redhat-linux-gnu/12.1.1/../../..
/lib
/usr/lib
clang 14.0.0 from HIP/ROCm 5.0.2
$ /cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/llvm/bin/clang++ --version
AMD clang version 14.0.0 (https://github.com/RadeonOpenCompute/llvm-project roc-5.0.2 22065 030a405a181176f1a7749819092f4ef8ea5f0758)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/llvm/bin
$ /cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/llvm/bin/clang++ --print-search-dirs | format
programs: =
/cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/llvm/bin
/usr/lib/gcc/x86_64-redhat-linux/8/../../../../x86_64-redhat-linux/bin
libraries: =
/cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/llvm/lib/clang/14.0.0
/usr/lib/gcc/x86_64-redhat-linux/8
/usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64
/lib/../lib64
/usr/lib/../lib64
/cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/llvm/bin/../lib
/lib
/usr/lib
$ /cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/llvm/bin/clang++ --print-search-dirs --gcc-toolchain=$TOOLCHAIN | format
programs: =
/cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/llvm/bin
libraries: =
/cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/llvm/lib/clang/14.0.0
/lib/../lib64
/usr/lib/../lib64
/cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/llvm/bin/../lib
/lib
/usr/lib
hipcc 5.0.13601 / AMD clang version 14.0.0 from HIP/ROCm 5.0.2
$ /cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/bin/hipcc --version
HIP version: 5.0.13601-ded05588
AMD clang version 14.0.0 (https://github.com/RadeonOpenCompute/llvm-project roc-5.0.2 22065 030a405a181176f1a7749819092f4ef8ea5f0758)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/llvm/bin
$ /cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/bin/hipcc --print-search-dirs | format
programs: =
/cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/llvm/bin
/usr/lib/gcc/x86_64-redhat-linux/8/../../../../x86_64-redhat-linux/bin
libraries: =
/cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/llvm/lib/clang/14.0.0
/usr/lib/gcc/x86_64-redhat-linux/8
/usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64
/lib/../lib64
/usr/lib/../lib64
/cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/llvm/bin/../lib
/lib
/usr/lib
$ /cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/bin/hipcc --print-search-dirs --gcc-toolchain=$TOOLCHAIN | format
programs: =
/cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/llvm/bin
libraries: =
/cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/llvm/lib/clang/14.0.0
/lib/../lib64
/usr/lib/../lib64
/cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/llvm/bin/../lib
/lib
/usr/lib
summary
With clang 14.0.0 from CentOS 8 Stream and clang 12.0.1 from a private build, --gcc-toolchain=TOOLCHAIN makes clang++ use TOOLCHAIN to find include files and libraries.
With clang 14.0.0 and hipcc 5.0.13601 from HIP/ROCm 5.0.2, --gcc-toolchain=TOOLCHAIN makes clang++ and hipcc drop some of the system paths, but it does not add TOOLCHAIN to the paths used to find include files and libraries.
Is there a way to use hipcc (and its clang++ counterpart) with an explicit GCC toolchain ?
Should the behaviour of the hipcc --gcc-toolchain=TOOLCHAIN be corrected to match that of the upstream build of clang++ ?
I think I have found the reason.
hipcc (and the version of clang coming with it) default to the target x86_64-unknown-linux-gnu:
$ /cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/bin/hipcc --version | grep Target
Target: x86_64-unknown-linux-gnu
clang from CentOS and our local build use x86_64-redhat-linux-gnu
$ /usr/bin/clang++ --version | grep Target
Target: x86_64-redhat-linux-gnu
$ /cvmfs/cms.cern.ch/el8_amd64_gcc12/external/llvm/12.0.1-a100c412676d03d68415d6def72fe659/bin/clang++ --version | grep Target
Target: x86_64-redhat-linux-gnu
And the local build of GCC uses x86_64-redhat-linux-gnu:
$ TOOLCHAIN=/cvmfs/cms.cern.ch/el8_amd64_gcc12/external/gcc/12.1.1-bf4aef5069fdf6bb6f77f897bcc8a6ae
$ ls $TOOLCHAIN | grep -e -
x86_64-redhat-linux-gnu
So hipcc does not find the target triple in the $TOOLCHAIN directory, and ignores it.
Passing explicitly the x86_64-redhat-linux-gnu target makes hipcc pick up the directories:
$ /cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/bin/hipcc --print-search-dirs --target=x86_64-redhat-linux-gnu --gcc-toolchain=$TOOLCHAIN | format
programs: =
/cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/llvm/bin
/cvmfs/cms.cern.ch/el8_amd64_gcc12/external/gcc/12.1.1-bf4aef5069fdf6bb6f77f897bcc8a6ae/lib/gcc/x86_64-redhat-linux-gnu/12.1.1/../../../../x86_64-redhat-linux-gnu/bin
libraries: =
/cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/llvm/lib/clang/14.0.0
/cvmfs/cms.cern.ch/el8_amd64_gcc12/external/gcc/12.1.1-bf4aef5069fdf6bb6f77f897bcc8a6ae/lib/gcc/x86_64-redhat-linux-gnu/12.1.1
/cvmfs/cms.cern.ch/el8_amd64_gcc12/external/gcc/12.1.1-bf4aef5069fdf6bb6f77f897bcc8a6ae/lib/gcc/x86_64-redhat-linux-gnu/12.1.1/../../../../lib64
/lib/../lib64
/usr/lib/../lib64
/cvmfs/cms.cern.ch/el8_amd64_gcc12/external/gcc/12.1.1-bf4aef5069fdf6bb6f77f897bcc8a6ae/lib/gcc/x86_64-redhat-linux-gnu/12.1.1/../../../../x86_64-redhat-linux-gnu/lib
/cvmfs/patatrack.cern.ch/externals/x86_64/rhel8/amd/rocm-5.0.2/llvm/bin/../lib
/lib
/usr/lib
Just a suggestion: for the CentOS/RedHat builds, would it make sense to use the x86_64-redhat-linux-gnu target instead of x86_64-unknown-linux-gnu ?
@fwyzard Hi were you able to resolve your issue on the latest HIP? If so, can we please close this ticket?