CUDA không tương thích với phiên bản gcc của tôi


102

Tôi gặp sự cố khi biên dịch một số ví dụ đi kèm với CUDA SDK. Tôi đã cài đặt trình điều khiển dành cho nhà phát triển (phiên bản 270.41.19) và bộ công cụ CUDA, sau đó cuối cùng là SDK (cả phiên bản 4.0.17).

Ban đầu nó không biên dịch gì cả cho:

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

Tôi tìm thấy dòng chịu trách nhiệm trong 81: /usr/local/cuda/include/host_config.h và đã thay đổi nó thành:

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

từ thời điểm đó, tôi chỉ có một số ví dụ để biên dịch, nó dừng lại với:

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

Như một số ví dụ biên dịch, tôi cho rằng đây không phải là vấn đề về trình điều khiển, mà là vấn đề liên quan đến một phiên bản gcc không được hỗ trợ. Hạ cấp không phải là một tùy chọn vì gcc4.6 có một hệ thống phụ thuộc vào thời điểm này ...


4
Đối với người đọc trong tương lai: Đảm bảo rằng bạn đang sử dụng phiên bản CUDA mới nhất (trừ khi bạn hoàn toàn phải sử dụng phiên bản đầu tiên). NVIDIA nâng cấp phiên bản trình biên dịch được hỗ trợ tối đa với hầu hết mọi phiên bản.
einpoklum

Điều này có thể hữu ích cho những người có CUDA 10 và nhận được lỗi của một quá cao một phiên bản gnu chuỗi trình biên dịch: stackoverflow.com/questions/53344283/...
Douglas Daseeco

Câu trả lời:


114

Như đã chỉ ra, nvcc phụ thuộc vào gcc 4.4. Có thể định cấu hình nvcc để sử dụng phiên bản gcc chính xác mà không cần chuyển bất kỳ tham số trình biên dịch nào bằng cách thêm liên kết mềm vào thư mục bin được tạo bằng cài đặt nvcc.

Thư mục nhị phân cuda mặc định (mặc định cài đặt) là / usr / local / cuda / bin, thêm một liên kết mềm vào đúng phiên bản gcc từ thư mục này là đủ:

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


2
"update-alternatives" lệnh cũng có thể giúp đỡ, đặc biệt là khi cài đặt CUDA 5.0
phoad

4
Tôi cũng phải thêm một liên kết tượng trưng vào phiên bản chính xác của g ++.
Auron

17
Tôi cũng phải liên kết đến g ++. Nếu không, đơn giản nvccinvocations làm việc, nhưng nói, áp dụng makecho các mẫu CUDA, sớm mang lại lời gọi bắt đầu với: nvcc -ccbin g++. Đối với tôi tôi đã sử dụng sudo ln -s /usr/bin/gcc-4.9 /usr/local/cuda/bin/gccsudo ln -s /usr/bin/g++-4.9 /usr/local/cuda/bin/g++.
user2023370 21/12/15

8
Nếu bạn biên dịch với cmake .. && makebạn có thể thử cmake -D CUDA_NVCC_FLAGS="-ccbin gcc-4.4" .. && make . Nếu bạn sử dụng đơn giản, Makefilebạn có thể thử make CXX=g++-4.4 CC=gcc-4.4 .
patryk.beza

1
khi tôi thử lệnh này, nó cho biết "Tệp tồn tại" và không thực hiện liên kết. Bất kỳ giúp đỡ?
Sentient07

59

gcc 4.5 và 4.6 không được hỗ trợ với CUDA - mã sẽ không biên dịch và phần còn lại của chuỗi công cụ, bao gồm cuda-gdb, sẽ không hoạt động bình thường. Bạn không thể sử dụng chúng và hạn chế là không thể thương lượng.

Giải pháp duy nhất của bạn là cài đặt phiên bản gcc 4.4 làm trình biên dịch thứ hai (hầu hết các bản phân phối sẽ cho phép điều đó). Có một tùy chọn cho nvcc --compiler-bindircó thể được sử dụng để trỏ đến một trình biên dịch thay thế. Tạo một thư mục cục bộ và sau đó tạo các liên kết tượng trưng đến các tệp thực thi phiên bản gcc được hỗ trợ. Chuyển thư mục cục bộ đó đến nvcc thông qua --compiler-bindirtùy chọn và bạn sẽ có thể biên dịch mã CUDA mà không ảnh hưởng đến phần còn lại của hệ thống.


CHỈNH SỬA :

Lưu ý rằng câu hỏi và câu trả lời này liên quan đến CUDA 4.

Kể từ khi nó được viết, NVIDIA đã tiếp tục mở rộng hỗ trợ cho các phiên bản gcc sau này trong bản phát hành chuỗi công cụ CUDA mới hơn

  • Kể từ bản phát hành CUDA 4.1, gcc 4.5 hiện đã được hỗ trợ. gcc 4.6 và 4.7 không được hỗ trợ.
  • Kể từ bản phát hành CUDA 5.0, gcc 4.6 hiện đã được hỗ trợ. gcc 4.7 không được hỗ trợ.
  • Kể từ phiên bản CUDA 6.0, gcc 4.7 hiện đã được hỗ trợ.
  • Kể từ bản phát hành CUDA 7.0, gcc 4.8 được hỗ trợ đầy đủ, với hỗ trợ 4.9 trên Ubuntu 14.04 và Fedora 21.
  • Kể từ bản phát hành CUDA 7.5, gcc 4.8 được hỗ trợ đầy đủ, với hỗ trợ 4.9 trên Ubuntu 14.04 và Fedora 21.
  • Kể từ bản phát hành CUDA 8, gcc 5.3 được hỗ trợ đầy đủ trên Ubuntu 16.06 và Fedora 23.
  • Kể từ bản phát hành CUDA 9, gcc 6 được hỗ trợ đầy đủ trên Ubuntu 16.04, Ubuntu 17.04 và Fedora 25.
  • Bản phát hành CUDA 9.2 bổ sung hỗ trợ cho gcc 7
  • Bản phát hành CUDA 10.1 bổ sung hỗ trợ cho gcc 8

Hiện tại (kể từ CUDA 10.1) không có hỗ trợ gcc 9 trong CUDA.

Lưu ý rằng NVIDIA gần đây đã thêm một bảng rất hữu ích tại đây chứa trình biên dịch và ma trận hệ điều hành được hỗ trợ cho bản phát hành CUDA hiện tại.


Bất kỳ ý tưởng nào được sử dụng cho CUDA 7.5?
GuySoft

2
Tôi sử dụng CUDA 7.5 với gcc 4.9.3SLES 11 SP3 mà không gặp vấn đề gì.
Peter VARGA

3
Gì? Làm thế nào một mã được cho là không biên dịch với các phiên bản cao hơn (tất nhiên là ngoại trừ các hạn chế của mã cứng) ? Điều duy nhất tôi có thể nghĩ đến là vì một số phiên bản có C11 / C ++ 11 được kích hoạt theo mặc định, nhưng nếu điều đó gây ra sự cố với mã cũ, điều đó có thể dễ dàng giải quyết bằng chuyển đổi dòng lệnh.
Hi-Angel

2
Biệt phái @ Hi-Angel. #talonmies "Hạn chế không thể thương lượng" có nghĩa là gì? Các phiên bản mới hơn của gcc và gdb hỗ trợ các tiêu đề nhị phân cũ hơn cho các tệp đối tượng, vì chúng "luôn luôn" (đại loại là), không có lý do gì các phiên bản gcc mới hơn không hoạt động. Bỏ qua các giải pháp Symlinking, mọi vấn đề khác rất có thể là cài đặt cờ phiên bản tiền xử lý ac và nếu kiểm tra phiên bản gcc được "mã hóa cứng" trong một số tiêu đề cuda như một phần của xác định hoặc macro, thì việc khắc phục rất dễ dàng. Ngoại lệ có thể là chính trình biên dịch gpu cuda.
Beracah

1
Đây không phải là câu hỏi về khả năng tương thích nhị phân. Chuỗi công cụ CUDA yêu cầu nvcc và trình phân tích cú pháp giao diện người dùng GPU có thể chặn và làm quá tải các tiêu đề nội bộ của trình biên dịch và libc / libc ++ khác nhau để cả biên dịch mã máy chủ và thiết bị và tích hợp chúng với nhau. Trình phân tích cú pháp CUDA cần có khả năng phân tích cú pháp chính xác các tiêu đề nội bộ gcc, trong số những thứ khác. Các phiên bản gcc chưa được kiểm tra có thể và không thành công, bất kể bộ bảo vệ tiền xử lý được tích hợp trong tiêu đề NVIDIA. Bạn có thể tin tôi (với tư cách là một người đã hack chuỗi công cụ CUDA trong gần 10 năm) hoặc không. Tại thời điểm này, tôi không thực sự
talonmies

57
  1. Kiểm tra phiên bản GCC được hỗ trợ tối đa cho phiên bản CUDA của bạn:

     | 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. Đặt env var cho phiên bản GCC đó. Ví dụ, đối với CUDA 10.2:

     MAX_GCC_VERSION=8
  3. Đảm bảo rằng bạn đã cài đặt phiên bản đó:

     sudo apt install gcc-$MAX_GCC_VERSION g++-$MAX_GCC_VERSION
  4. Thêm các liên kết tượng trưng trong các thư mục 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++

    (hoặc thay thế /usr/local/cudabằng đường dẫn cài đặt CUDA của bạn, nếu nó không có ở đó)

Xem ý chính GitHub này để biết thêm thông tin về bảng tương thích CUDA-GCC .


3
Đã cứu cuộc đời tôi cơn ác mộng cấu hình lol !!!! cảm ơn bạn. Tôi đã áp dụng điều này cho cuda 10 với các liên kết hệ thống gcc và g ++ 7. Đối với bất kỳ ai gặp phải điều này.
thekevshow

Tôi có nên tự tạo /usr/bin/gcc/usr/bin/g++hoặc /usr/local/cuda/bin/gcccác thư mục không?
Josh Desmond

@JoshDesmond liên kết biểu tượng cho các tệp bạn đã đề cập được tạo ở bước 4.
bryant1410

@ bryant1410 Khi tôi chạy các lệnh ở bước bốn, tôi nhớ mình đã gặp lỗi dọc theo dòng "Lỗi: directory / usr / local / cuda / bin / gcc không tồn tại, đang hủy bỏ" hoặc một cái gì đó tương tự. Bây giờ tôi nhận ra, (sau khi đọc chi tiết câu hỏi), câu trả lời của bạn giả định bước 0 được OP đề cập: "Tôi đã cài đặt bộ công cụ CUDA, sau đó cuối cùng là SDK". Tôi đã cố gắng thực hiện cài đặt bằng cuda_10.2.89_440.33.01_linux.runthuật sĩ của NVIDIA , điều này chỉ đơn giản là không thành công trong thời gian chạy với khiếu nại về khả năng tương thích gcc. Cuối cùng tôi chỉ quyết định gỡ cài đặt gcc 9: P
Josh Desmond

1
Nếu bạn đã cài đặt NVCC với [ana | mini] conda (gói conda-forge cudatoolkit-dev), thì bạn cần liên kết bên trong env like của mình ln -s /usr/bin/gcc-8 /home/user/miniconda3/envs/your_env/bin/gccln -s /usr/bin/g++-8 /home/user/miniconda3/envs/your_env/bin/g++
Diego Ferri

25

Giải pháp của Gearoid Murphy hoạt động tốt hơn đối với tôi vì trên bản phân phối của tôi (Ubuntu 11.10), gcc-4.4 và gcc-4.6 nằm trong cùng một thư mục, vì vậy --compiler-bindir không có ích gì. Cảnh báo duy nhất là tôi cũng phải cài đặt g ++ - 4.4 và liên kết biểu tượng với nó:

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++

11

Đối với CUDA7.5 những dòng này hoạt động:

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++

9

Hãy xem cách sử dụng "các lựa chọn thay thế cập nhật" để khắc phục sự cố này:

... Nếu bạn cài đặt gcc 4.6, bạn cũng có thể sử dụng lệnh update-Alternatives để cho phép dễ dàng chuyển đổi giữa các phiên bản. Điều này có thể được định cấu hình với:

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

6

Nếu sử dụng cmakecho tôi, không có thủ thuật chỉnh sửa tệp và liên kết nào hoạt động, vì vậy tôi đã biên dịch bằng cách sử dụng cờ chỉ định phiên bản gcc / g ++.
cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 ..

Làm việc như một sự quyến rũ.


haha Tôi sẽ cố gắng liên kết câu trả lời của bạn với câu hỏi khác ở đây vì tôi nghĩ nó cần được đưa vào chủ đề này. Làm tốt một lần nữa! Cảm ơn
MikeDoho

Người ta nên hạn chế đăng các câu trả lời trùng lặp trên SO nhưng tôi không có lựa chọn nào. :)
markroxor

5

Trên hầu hết các bản phân phối, bạn có thể cài đặt một phiên bản gcc và g ++ khác bên cạnh trình biên dịch mới nhất như gcc-4.7. Ngoài ra, hầu hết các hệ thống xây dựng đều biết về các biến CCCXXbiến môi trường, cho phép chỉ định cho bạn các trình biên dịch C và C ++ khác tương ứng. VẬY tôi đề nghị một cái gì đó như:

CC=gcc-4.4 CXX=g++-4.4 cmake path/to/your/CMakeLists.txt

Đối với Makefiles cũng nên có cách làm tương tự. Tôi không khuyên bạn nên đặt các liên kết tượng trưng tùy chỉnh trong / usr / local trừ khi bạn biết mình đang làm gì.


3

Điều này hoạt động với fedora 23. Kho lưu trữ compat gcc sẽ hơi khác dựa trên phiên bản fedora của bạn.

Nếu bạn cài đặt các kho lưu trữ sau:

sudo yum install compat-gcc-34-c++-3.4.6-37.fc23.x86_64 compat-gcc-34-3.4.6-37.fc23.x86_64 

Bây giờ hãy tạo các liên kết mềm như đã đề cập ở trên giả sử thư mục bin cuda của bạn nằm trong /usr/local/cuda/

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

Bây giờ bạn có thể biên dịch với nvccmà không gặp lỗi phiên bản gcc.


2

Giải pháp của Gearoid Murphy hoạt động như một sự quyến rũ. Đối với tôi, tôi có hai thư mục cho cuda -

/usr/local/cuda 
/usr/local/cuda-5.0

Các liên kết mềm chỉ được thêm vào thư mục được đề cập bên dưới -

/usr/local/cuda 

Ngoài ra, cả liên kết mềm g ++ và gcc đều được yêu cầu như được đề cập bởi SchighSchagh.


2

Một cách khác để định cấu hình nvcc để sử dụng một phiên bản cụ thể của gcc (ví dụ: gcc-4.4), là chỉnh sửa nvcc.profile và thay đổi PATH để bao gồm đường dẫn đến gcc mà bạn muốn sử dụng trước tiên.

Ví dụ (gcc-4.4.6 được cài đặt trong / opt):

PATH += /opt/gcc-4.4.6/lib/gcc/x86_64-unknown-linux-gnu/4.4.6:/opt/gcc-4.4.6/bin:$(TOP)/open64/bin:$(TOP)/share/cuda/nvvm:$(_HERE_):

Vị trí của nvcc.profile khác nhau, nhưng nó phải nằm trong cùng thư mục với chính tệp thực thi nvcc .

Đây là một chút hack, vì nvcc.profile không dành cho cấu hình người dùng theo hướng dẫn sử dụng nvcc, nhưng đó là giải pháp phù hợp nhất với tôi.


Tôi khuyên bạn nên làm điều này, nhưng trỏ đường dẫn đến thư mục có liên kết tượng trưng g ++ đến đúng phiên bản gcc (đặc biệt hữu ích nếu bản phân phối của bạn cung cấp phiên bản gcc được hỗ trợ). Ví dụ:mkdir /usr/local/bin/cuda-hack && ln -s /usr/bin/g++-5 /usr/local/bin/cuda-hack
Sami Liedes


2

Đối với những người như tôi, những người bị nhầm lẫn khi sử dụng cmake, FindCUDA.cmaketập lệnh sẽ ghi đè một số nội dung từ nvcc.profile. Bạn có thể chỉ định nvcctrình biên dịch máy chủ lưu trữ bằng cách thiết lập CUDA_HOST_COMPILERtheo http://public.kitware.com/Bug/view.php?id=13674 .


cmake .. -DCMAKE_INSTALL_PREFIX=/InstallPos_GPU/ -DCMAKE_C_COMPILER="/gcc-8.3.0/bin/gcc" -DCMAKE_CXX_COMPILER="/gcc-8.3.0/bin/g++" -DGMX_GPU=ON -DCUDA_TOOLKIT_ROOT_DIR=/cuda-7.5/ -D NVCCFLAGS=" -ccbin /cuda-7.5/bin/" -DCUDA_HOST_COMPILER=/cuda-7.5/bin/gccTôi đã cài đặt thành công gromacs có hỗ trợ GPU.
pengchy

2

Tôi đã phải cài đặt các phiên bản cũ hơn của gcc, g ++.

    sudo apt-get install gcc-4.4
    sudo apt-get install g++-4.4

Kiểm tra xem gcc-4.4 có trong / usr / bin / và tương tự đối với g ++ Sau đó, tôi có thể sử dụng giải pháp ở trên:

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

Khi tôi thử lệnh này, nó cho biết "Tệp tồn tại" và không thực hiện liên kết. Bất kỳ giúp đỡ?
Sentient07

Tôi e rằng tôi đã quá xa khi nghĩ về điều này để biết phải nói gì. Hy vọng rằng những người khác có thể giúp đỡ.
du lịch

2

Trong $CUDA_HOME/include/host_config.h, tìm các dòng như thế này (có thể hơi khác nhau giữa các phiên bản CUDA khác nhau):

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

#error -- unsupported GNU version! gcc versions later than 4.9 are not supported!

#endif [> __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 9) <]
//...

Loại bỏ hoặc thay đổi chúng phù hợp với tình trạng của bạn.

Lưu ý rằng phương pháp này tiềm ẩn không an toàn và có thể phá vỡ cấu trúc của bạn. Ví dụ: gcc 5 sử dụng C ++ 11 làm mặc định, tuy nhiên, đây không phải là trường hợp của nvcc kể từ CUDA 7.5. Một cách giải quyết là thêm

--Xcompiler="--std=c++98" cho CUDA <= 6,5

hoặc là

--std=c++11 cho CUDA> = 7,0.


chúng ta thêm --std=c++tùy chọn vào đâu?
asgs

1

Nếu bạn gặp lỗi này, vui lòng đọc tệp nhật ký:

$ cat /var/log/cuda-installer.log 
[INFO]: Driver installation detected by command: apt list --installed | grep -e nvidia-driver-[0-9][0-9][0-9] -e nvidia-[0-9][0-9][0-9]
[INFO]: Cleaning up window
[INFO]: Complete
[INFO]: Checking compiler version...
[INFO]: gcc location: /usr/bin/gcc

[INFO]: gcc version: gcc version 9.2.1 20191008 (Ubuntu 9.2.1-9ubuntu2) 

[ERROR]: unsupported compiler version: 9.2.1. Use --override to override this check.

Chỉ cần làm theo gợi ý trong tệp nhật ký:

sudo sh cuda_<version>_linux.run --override

Công việc hoàn thành :)

Tôi vừa cài đặt CUDA 10.2 với gcc 9.2 trên Kubuntu 19.10 bằng cách sử dụng --overridetùy chọn.


0

Để biên dịch các ví dụ CUDA 8.0 trên Ubuntu 16.10, tôi đã làm:

sudo apt-get install gcc-5 g++-5
cd /path/to/NVIDIA_CUDA-8.0_Samples
# Find the path to the library (this should be in NVIDIA's Makefiles)
LIBLOC=`find /usr/lib -name "libnvcuvid.so.*" | head -n1 | perl -pe 's[/usr/lib/(nvidia-\d+)/.*][$1]'`
# Substitute that path into the makefiles for the hard-coded, incorrect one
find . -name "*.mk" | xargs perl -pi -e "s/nvidia-\d+/$LIBLOC/g"
# Make using the supported compiler
HOST_COMPILER=g++-5 make

Điều này có lợi thế là không sửa đổi toàn bộ hệ thống hoặc tạo các liên kết tượng trưng cho chỉ các tệp nhị phân (điều này có thể gây ra sự cố liên kết thư viện).


0

Điều này đã giải quyết vấn đề của tôi:

sudo rm /usr/local/cuda/bin/gcc
sudo rm /usr/local/cuda/bin/g++
sudo apt install gcc-4.4 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++

0

Đối với CUDA 6.5 (và dường như là 7.0 và 7.5), tôi đã tạo một phiên bản của gói gcc 4.8.5 RPM (trong Fedora Core 30) cho phép cài đặt phiên bản gcc đó cùng với GCC hiện tại của hệ thống của bạn.

Bạn có thể tìm thấy tất cả các thông tin đó ở đây .


0

Trong trường hợp của tôi, tôi đã cài đặt CUDA từ phiên bản Ubuntu và cmake sẽ phát hiện ra cái đó thay vì phiên bản mới được cài đặt bằng Trình quản lý SDK NVidia.

Tôi đã chạy dpkg -l | grep cuda và có thể thấy cả hai phiên bản.

Những gì tôi phải làm là gỡ cài đặt CUDA cũ (trong trường hợp của tôi là phiên bản 9.1) và để nguyên phiên bản mới (phiên bản 10.2). Tôi đã sử dụng lệnh tẩy như sau:

sudo apt-get purge libcudart9.1 nvidia-cuda-dev nvidia-cuda-doc \
                                nvidia-cuda-gdb nvidia-cuda-toolkit

Vui lòng xác minh rằng tên gói phù hợp với phiên bản bạn muốn xóa khỏi cài đặt của mình.

Tôi đã phải chạy lại cmaketừ một BUILDthư mục trống để chuyển hướng tất cả #includevà thư viện đến phiên bản SDK (vì các đường dẫn cũ đã được nướng trong môi trường xây dựng hiện có).


-1

Điều này đang xảy ra vì phiên bản CUDA hiện tại của bạn không hỗ trợ phiên bản GCC hiện tại của bạn. Bạn cần làm như sau:

  1. Tìm phiên bản GCC được hỗ trợ (trong trường hợp của tôi là 5 cho CUDA 9)

    • CUDA 4.1: GCC 4.5
    • CUDA 5.0: GCC 4.6
    • CUDA 6.0: GCC 4.7
    • CUDA 7.0: GCC 4.8
    • CUDA 7.5: GCC 4.8
    • CUDA 8: GCC 5.3
    • CUDA 9: GCC 5.5
    • CUDA 9.2: GCC 7
    • CUDA 10.1: GCC 8
  2. Cài đặt phiên bản GCC được hỗ trợ

    sudo apt-get install gcc-5
    sudo apt-get install g++-5
  3. Thay đổi các liên kết mềm cho GCC trong /usr/binthư mục

    cd /usr/bin
    sudo rm gcc
    sudo rm g++
    sudo ln -s /usr/bin/gcc-5 gcc
    sudo ln -s /usr/bin/g++-5 g++
  4. Thay đổi các liên kết mềm cho GCC trong /usr/local/cuda-9.0/binthư mục

    cd /usr/local/cuda-9.0/bin
    sudo rm gcc
    sudo rm g++
    sudo ln -s /usr/bin/gcc-5 gcc
    sudo ln -s /usr/bin/g++-5 g++
  5. Thêm -DCUDA_HOST_COMPILER=/usr/bin/gcc-5vào setup.pytệp của bạn , được sử dụng để biên dịch

    if torch.cuda.is_available() and CUDA_HOME is not None:
        extension = CUDAExtension
        sources += source_cuda
        define_macros += [("WITH_CUDA", None)]
        extra_compile_args["nvcc"] = [
            "-DCUDA_HAS_FP16=1",
            "-D__CUDA_NO_HALF_OPERATORS__",
            "-D__CUDA_NO_HALF_CONVERSIONS__",
            "-D__CUDA_NO_HALF2_OPERATORS__",
            "-DCUDA_HOST_COMPILER=/usr/bin/gcc-5"
        ]
  6. Xóa thư mục bản dựng cũ

    rm -rd build/
  7. Biên dịch lại bằng cách cài đặt CUDAHOSTCXX=/usr/bin/gcc-5

    CUDAHOSTCXX=/usr/bin/gcc-5 python setup.py build develop

Lưu ý: Nếu bạn vẫn gặp gcc: error trying to exec 'cc1plus': execvp: no such file or directorylỗi sau khi làm theo các bước này, hãy thử cài đặt lại GCC như thế này và sau đó biên dịch lại:

sudo apt-get install --reinstall gcc-5
sudo apt-get install --reinstall g++-5

Tín dụng: https://github.com/facebookresearch/maskrcnn-benchmark/issues/25#issuecomment-433382510

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.