[gcc] CUDA가 내 gcc 버전과 호환되지 않습니다.

CUDA SDK와 함께 제공되는 일부 예제를 컴파일하는 데 문제가 있습니다. 개발자 드라이버 (버전 270.41.19)와 CUDA 툴킷을 설치 한 다음 마지막으로 SDK (모두 4.0.17 버전)를 설치했습니다.

처음에는 전혀 컴파일되지 않았습니다.

error -- unsupported GNU version! gcc 4.5 and up are not supported!

81 : /usr/local/cuda/include/host_config.h에서 담당하는 줄을 발견하고 다음과 같이 변경했습니다.

//#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4)
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6)

그 시점부터 컴파일 할 예제 중 몇 개만 얻었으며 다음과 같이 중지됩니다.

In file included from /usr/include/c++/4.6/x86_64-linux-gnu/bits/gthr.h:162:0,
             from /usr/include/c++/4.6/ext/atomicity.h:34,
             from /usr/include/c++/4.6/bits/ios_base.h:41,
             from /usr/include/c++/4.6/ios:43,
             from /usr/include/c++/4.6/ostream:40,
             from /usr/include/c++/4.6/iterator:64,
             from /usr/local/cuda/include/thrust/iterator/iterator_categories.h:38,
             from /usr/local/cuda/include/thrust/device_ptr.h:26,
             from /usr/local/cuda/include/thrust/device_malloc_allocator.h:27,
             from /usr/local/cuda/include/thrust/device_vector.h:26,
             from lineOfSight.cu:37:
/usr/include/c++/4.6/x86_64-linux-gnu/bits/gthr-default.h:251:1: error: pasting         "__gthrw_" and "/* Android's C library does not provide pthread_cancel, check for
`pthread_create' instead.  */" does not give a valid preprocessing token
make[1]: *** [obj/x86_64/release/lineOfSight.cu.o] Error 1

일부 예제가 컴파일되면 이것이 드라이버 문제가 아니라 지원되지 않는 gcc 버전과 관련이 있다고 생각합니다. gcc4.6은이 시점에서 전체 시스템을 종속성으로 사용하므로 다운 그레이드는 옵션이 아닙니다.



답변

이미 지적했듯이 nvcc는 gcc 4.4에 의존합니다. nvcc 설치로 생성 된 bin 디렉토리에 소프트 링크를 추가하여 컴파일러 매개 변수를 전달하지 않고도 올바른 버전의 gcc를 사용하도록 nvcc를 구성 할 수 있습니다.

기본 cuda 바이너리 디렉토리 (설치 기본값)는 / usr / local / cuda / bin이며,이 디렉토리에서 올바른 gcc 버전에 대한 소프트 링크를 추가하는 것으로 충분합니다.

sudo ln -s /usr/bin/gcc-4.4 /usr/local/cuda/bin/gcc


답변

gcc 4.5 및 4.6은 CUDA에서 지원되지 않습니다. 코드가 컴파일되지 않고 cuda-gdb를 포함한 나머지 도구 모음이 제대로 작동하지 않습니다. 사용할 수 없으며 제한 사항은 협상 할 수 없습니다.

유일한 해결책은 gcc 4.4 버전을 두 번째 컴파일러 로 설치하는 것입니다 (대부분의 배포판에서는이를 허용합니다). --compiler-bindir대체 컴파일러를 가리키는 데 사용할 수있는 nvcc에 대한 옵션 이 있습니다. 로컬 디렉토리를 만든 다음 지원되는 gcc 버전 실행 파일에 대한 심볼릭 링크를 만듭니다. --compiler-bindir옵션을 통해 해당 로컬 디렉토리를 nvcc로 전달 하면 나머지 시스템에 영향을주지 않고 CUDA 코드를 컴파일 할 수 있습니다.


수정 :

이 질문과 답변은 CUDA 4와 관련이 있습니다.

작성된 이후 NVIDIA는 최신 CUDA 툴체인 릴리스에서 최신 gcc 버전에 대한 지원을 계속 확장했습니다.

  • CUDA 4.1 릴리스부터 gcc 4.5가 지원됩니다. gcc 4.6 및 4.7은 지원되지 않습니다.
  • CUDA 5.0 릴리스부터 gcc 4.6이 지원됩니다. gcc 4.7은 지원되지 않습니다.
  • CUDA 6.0 릴리스부터 gcc 4.7이 지원됩니다.
  • CUDA 7.0 릴리스부터 gcc 4.8은 Ubuntu 14.04 및 Fedora 21에서 4.9 지원과 함께 완전히 지원됩니다.
  • CUDA 7.5 릴리스부터 gcc 4.8이 완전히 지원되며 Ubuntu 14.04 및 Fedora 21에서 4.9를 지원합니다.
  • CUDA 8 릴리스부터 gcc 5.3은 Ubuntu 16.06 및 Fedora 23에서 완전히 지원됩니다.
  • CUDA 9 릴리스부터 gcc 6은 Ubuntu 16.04, Ubuntu 17.04 및 Fedora 25에서 완벽하게 지원됩니다.
  • CUDA 9.2 릴리스는 gcc 7에 대한 지원을 추가합니다.
  • CUDA 10.1 릴리스는 gcc 8에 대한 지원을 추가합니다.

현재 (CUDA 10.1 기준) CUDA에는 gcc 9 지원이 없습니다.

NVIDIA는 최근 CUDA 릴리스에 대해 지원되는 컴파일러 및 OS 매트릭스가 포함 된 매우 유용한 표를 여기 에 추가했습니다 .


답변

  1. CUDA 버전에 대해 지원되는 최대 GCC 버전을 확인하십시오.

     | CUDA version | max supported GCC version |
     |--------------|---------------------------|
     |      11      |             9             |
     |  10.1, 10.2  |             8             |
     |   9.2, 10.0  |             7             |
     |   9.0, 9.1   |             6             |
     |       8      |            5.3            |
     |       7      |            4.9            |
     |    5.5, 6    |            4.8            |
     |    4.2, 5    |            4.6            |
     |      4.1     |            4.5            |
     |      4.0     |            4.4            |
    
  2. 해당 GCC 버전에 대한 환경 변수를 설정합니다. 예를 들어 CUDA 10.2의 경우 :

     MAX_GCC_VERSION=8
  3. 해당 버전이 설치되어 있는지 확인하십시오.

     sudo apt install gcc-$MAX_GCC_VERSION g++-$MAX_GCC_VERSION
  4. CUDA 폴더 내에 심볼릭 링크 추가 :

     sudo ln -s /usr/bin/gcc-$MAX_GCC_VERSION /usr/local/cuda/bin/gcc 
     sudo ln -s /usr/bin/g++-$MAX_GCC_VERSION /usr/local/cuda/bin/g++
    

    (또는 /usr/local/cudaCUDA 설치 경로가없는 경우 대체 )

CUDA-GCC 호환성 표에 대한 자세한 내용은이 GitHub 요점을 참조하세요 .


답변

Gearoid Murphy의 솔루션은 내 배포판 (Ubuntu 11.10)에서 gcc-4.4 및 gcc-4.6이 동일한 디렉토리에 있으므로 –compiler-bindir은 도움이되지 않기 때문에 더 잘 작동합니다. 유일한주의 사항은 g ++-4.4를 설치하고 심볼릭 링크도해야한다는 것입니다.

sudo ln -s /usr/bin/gcc-4.4 /usr/local/cuda/bin/gcc
sudo ln -s /usr/bin/g++-4.4 /usr/local/cuda/bin/g++


답변

CUDA7.5의 경우 다음 라인이 작동합니다.

sudo ln -s /usr/bin/gcc-4.9 /usr/local/cuda/bin/gcc 
sudo ln -s /usr/bin/g++-4.9 /usr/local/cuda/bin/g++


답변

이 문제를 해결 하려면 “update-alternatives”를 사용하는 방법을 확인하십시오 .

… gcc 4.6을 설치하면 update-alternatives 명령을 사용하여 버전간에 쉽게 전환 할 수 있습니다. 다음과 같이 구성 할 수 있습니다.

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6 
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7 
sudo update-alternatives --config gcc

답변

cmake나를 위해 사용 하는 경우 파일 편집 및 링크의 해킹이 작동하지 않았으므로 gcc / g ++ 버전을 지정하는 플래그를 사용하여 컴파일했습니다.
cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 ..

매력처럼 작동했습니다.