CUDA เข้ากันไม่ได้กับเวอร์ชัน gcc ของฉัน


105

ฉันมีปัญหาในการรวบรวมตัวอย่างบางส่วนที่มาพร้อมกับ 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 มีทั้งระบบเป็นการพึ่งพา ณ จุดนี้ ...


4
สำหรับผู้อ่านในอนาคต: ตรวจสอบให้แน่ใจว่าคุณใช้ CUDA เวอร์ชันล่าสุด (เว้นแต่คุณจะต้องใช้เวอร์ชันแรก ๆ ) NVIDIA เพิ่มเวอร์ชันคอมไพเลอร์ที่รองรับสูงสุดเกือบทุกรุ่น
einpoklum

สิ่งนี้อาจเป็นประโยชน์สำหรับผู้ที่มี CUDA 10 และได้รับข้อผิดพลาดของเวอร์ชันเชนคอมไพเลอร์ gnu ที่สูงเกินไป: stackoverflow.com/questions/53344283/…
Douglas Daseeco

คำตอบ:


118

ดังที่ได้กล่าวไปแล้ว nvcc ขึ้นอยู่กับ gcc 4.4 เป็นไปได้ที่จะกำหนดค่า nvcc ให้ใช้ gcc เวอร์ชันที่ถูกต้องโดยไม่ต้องส่งผ่านพารามิเตอร์ของคอมไพเลอร์ใด ๆ โดยการเพิ่มซอฟต์ลิงก์ลงในไดเร็กทอรี bin ที่สร้างด้วยการติดตั้ง nvcc

ไดเร็กทอรีไบนารี cuda ดีฟอลต์ (ค่าเริ่มต้นในการติดตั้ง) คือ / usr / local / cuda / bin การเพิ่ม softlink ไปยัง gcc เวอร์ชันที่ถูกต้องจากไดเร็กทอรีนี้ก็เพียงพอแล้ว:

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


2
คำสั่ง "update-alternate" อาจช่วยได้เช่นกันโดยเฉพาะเมื่อติดตั้ง CUDA 5.0
phoad

4
ฉันต้องเพิ่มลิงก์สัญลักษณ์ไปยังเวอร์ชันที่ถูกต้องของ g ++ ด้วย
Auron

17
ฉันต้องเชื่อมโยงกับ g ++ ด้วย มิฉะนั้นง่ายnvccสวดทำงาน แต่บอกว่าใช้makeกับตัวอย่าง CUDA เร็ว ๆ nvcc -ccbin g++นี้นำในการสวดเริ่มต้นด้วย: สำหรับฉันฉันใช้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++.
user2023370

8
หากคุณรวบรวมกับcmake .. && makeคุณสามารถลอง cmake -D CUDA_NVCC_FLAGS="-ccbin gcc-4.4" .. && makeถ้าคุณใช้ธรรมดาMakefileที่คุณสามารถลอง make CXX=g++-4.4 CC=gcc-4.4
patryk.beza

1
เมื่อฉันลองใช้คำสั่งนี้มันขึ้นว่า "มีไฟล์อยู่" และไม่มีการเชื่อมโยง ความช่วยเหลือใด ๆ
Sentient07

60

ไม่รองรับ gcc 4.5 และ 4.6 กับ CUDA - โค้ดจะไม่คอมไพล์และส่วนที่เหลือของ toolchain รวมถึง cuda-gdb จะทำงานไม่ถูกต้อง คุณไม่สามารถใช้งานได้และข้อ จำกัด นี้ไม่สามารถต่อรองได้

ทางออกเดียวของคุณคือติดตั้ง gcc 4.4 เวอร์ชันเป็นคอมไพเลอร์ที่สอง (การแจกแจงส่วนใหญ่จะอนุญาต) มีตัวเลือกเป็น nvcc --compiler-bindirซึ่งสามารถใช้เพื่อชี้ไปยังคอมไพเลอร์ทางเลือก สร้างโลคัลไดเร็กทอรีจากนั้นสร้างลิงก์สัญลักษณ์ไปยังไฟล์ปฏิบัติการเวอร์ชัน gcc ที่รองรับ ส่งผ่านโลคัลไดเร็กทอรีไปยัง nvcc ผ่าน--compiler-bindirตัวเลือกและคุณควรจะสามารถคอมไพล์โค้ด CUDA ได้โดยไม่ส่งผลกระทบต่อระบบที่เหลือของคุณ


แก้ไข :

โปรดทราบว่าคำถามและคำตอบนี้เกี่ยวข้องกับ CUDA 4

นับตั้งแต่มีการเขียนขึ้น NVIDIA ก็ยังคงขยายการสนับสนุนสำหรับ gcc เวอร์ชันหลัง ๆ ในการเปิดตัว CUDA toolchain ที่ใหม่กว่า

  • ตั้งแต่รุ่น 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 อย่างสมบูรณ์โดยรองรับ 4.9 บน Ubuntu 14.04 และ Fedora 21
  • ในรุ่น CUDA 7.5 นั้นรองรับ gcc 4.8 อย่างสมบูรณ์โดยรองรับ 4.9 บน Ubuntu 14.04 และ Fedora 21
  • ตั้งแต่ 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) ไม่มีการรองรับ gcc 9 ใน CUDA

โปรดทราบว่าเมื่อเร็ว ๆ นี้ NVIDIA ได้เพิ่มตารางที่มีประโยชน์มากที่นี่ซึ่งมีคอมไพเลอร์และเมทริกซ์ระบบปฏิบัติการที่รองรับสำหรับ CUDA รุ่นปัจจุบัน


มีความคิดใดบ้างที่ใช้สำหรับ CUDA 7.5?
GuySoft

2
ฉันใช้ CUDA 7.5 กับgcc 4.9.3SLES 11 SP3 โดยไม่มีปัญหาใด ๆ
Peter VARGA

3
อะไร? วิธีการคือรหัสควรจะไม่รวบรวมกับรุ่นที่สูงขึ้น(ยกเว้นข้อ จำกัด hardcoded แน่นอน) ? สิ่งเดียวที่ฉันคิดได้ก็คือเนื่องจากบางเวอร์ชันมี C11 / C ++ 11 ถูกเปิดใช้งานโดยค่าเริ่มต้น แต่หากเป็นสาเหตุให้เกิดปัญหากับรหัสเก่าอาจเป็นวิธีแก้ปัญหาได้ง่ายด้วยสวิตช์บรรทัดคำสั่ง
Hi-Angel

2
Seconding @ Hi-Angel. #talonmies "ข้อ จำกัด ไม่สามารถต่อรองได้" หมายความว่าอย่างไร gcc และ gdb เวอร์ชันใหม่กว่ารองรับส่วนหัวไบนารีที่เก่ากว่าสำหรับไฟล์อ็อบเจ็กต์เนื่องจาก "เสมอ" (ประเภท) มีจึงไม่มีเหตุผลที่เวอร์ชัน gcc ที่ใหม่กว่าไม่ควรทำงาน นอกเหนือจากโซลูชัน Symlinking แล้วปัญหาอื่น ๆ มักเป็นไปได้ว่าการตั้งค่าแฟล็กเวอร์ชันก่อนโปรเซสเซอร์ ac และหากการทดสอบเวอร์ชัน gcc เป็น "ฮาร์ดโค้ด" ในส่วนหัวของ cuda บางส่วนซึ่งเป็นส่วนหนึ่งของการกำหนดหรือมาโครการแก้ไขก็ทำได้ง่าย ข้อยกเว้นอาจเป็นคอมไพเลอร์ cuda gpu เอง
Beracah

1
นี่ไม่ใช่คำถามเกี่ยวกับความเข้ากันได้ของไบนารี CUDA toolchain ต้องการให้ nvcc และ GPU front end parser สามารถดักจับและโอเวอร์โหลดคอมไพเลอร์ต่างๆและส่วนหัวภายใน libc / libc ++ เพื่อคอมไพล์โฮสต์และโค้ดอุปกรณ์และรวมเข้าด้วยกัน ตัวแยกวิเคราะห์ CUDA ต้องสามารถแยกวิเคราะห์ส่วนหัวภายใน gcc ได้อย่างถูกต้องเหนือสิ่งอื่นใด เวอร์ชัน gcc ที่ไม่ผ่านการทดสอบสามารถและล้มเหลวได้โดยไม่คำนึงถึงตัวป้องกันของตัวประมวลผลล่วงหน้าที่ติดตั้งไว้ในส่วนหัวของ NVIDIA คุณสามารถเชื่อฉันได้ (ในฐานะคนที่แฮ็ก CUDA toolchain มาเกือบ 10 ปี) หรือไม่ก็ได้ ณ จุดนี้ฉันไม่เข้าใจจริงๆ
กรงเล็บ

58
  1. ตรวจสอบเวอร์ชัน GCC ที่รองรับสูงสุดสำหรับเวอร์ชัน CUDA ของคุณ:

     | 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. ตั้งค่า env var สำหรับเวอร์ชัน GCC นั้น ตัวอย่างเช่นสำหรับ CUDA 10.2:

     MAX_GCC_VERSION=8
    
  3. ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งเวอร์ชันนั้นแล้ว:

     sudo apt install gcc-$MAX_GCC_VERSION g++-$MAX_GCC_VERSION
    
  4. เพิ่ม symlinks ภายในโฟลเดอร์ 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/cudaด้วยเส้นทางการติดตั้ง CUDA ของคุณหากไม่มี)

ดูกระทู้นี้ GitHub สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตารางการทำงานร่วมกัน


3
ช่วยชีวิตฉัน lol configuration ฝันร้าย !!!! ขอบคุณ. ฉันใช้สิ่งนี้กับ cuda 10 พร้อมลิงก์ระบบ gcc และ g ++ 7 สำหรับใครที่เจอเรื่องนี้
thekevshow

ฉันควรสร้าง/usr/bin/gccและ/usr/bin/g++หรือ/usr/local/cuda/bin/gccโฟลเดอร์ด้วยตัวเองหรือไม่
Josh Desmond

@JoshDesmond symlink สำหรับไฟล์ที่คุณกล่าวถึงถูกสร้างขึ้นในขั้นตอนที่ 4
bryant1410

@ bryant1410 เมื่อฉันรันคำสั่งในขั้นตอนที่สี่ฉันจำได้ว่าได้รับข้อผิดพลาดตามบรรทัด "ข้อผิดพลาด: ไม่มีไดเร็กทอรี / usr / local / cuda / bin / gcc ยกเลิก" หรือสิ่งที่คล้ายกัน ตอนนี้ฉันตระหนักดี (หลังจากอ่านรายละเอียดของคำถาม) ว่าคำตอบของคุณถือว่าเป็นขั้นตอนที่ 0 ที่ OP กล่าวถึง: "ฉันได้ติดตั้งชุดเครื่องมือ CUDA จากนั้นก็เป็น SDK ในที่สุด" ฉันพยายามทำการติดตั้งด้วยวิcuda_10.2.89_440.33.01_linux.runซาร์ดของ NVIDIA ซึ่งล้มเหลวในรันไทม์พร้อมกับการร้องเรียนเกี่ยวกับความเข้ากันได้ของ gcc ฉันเพิ่งตัดสินใจถอนการติดตั้ง gcc 9: P
Josh Desmond

1
หากคุณติดตั้ง NVCC ด้วย [ana | mini] conda (conda-forge package cudatoolkit-dev) คุณจะต้องเชื่อมโยงภายใน env ของคุณเช่นln -s /usr/bin/gcc-8 /home/user/miniconda3/envs/your_env/bin/gccและln -s /usr/bin/g++-8 /home/user/miniconda3/envs/your_env/bin/g++
Diego Ferri

25

โซลูชันของ Gearoid Murphy ทำงานได้ดีขึ้นสำหรับฉันเนื่องจากบน distro ของฉัน (Ubuntu 11.10), gcc-4.4 และ gcc-4.6 อยู่ในไดเร็กทอรีเดียวกันดังนั้น --compiler-bindir จึงไม่ช่วย ข้อแม้เดียวคือฉันต้องติดตั้ง g ++ - 4.4 และ symlink ด้วย:

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

สำหรับ 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++

9

ดูวิธีการใช้ "ทางเลือกการอัปเดต"เพื่อแก้ไขปัญหานี้:

... หากคุณติดตั้ง gcc 4.6 คุณยังสามารถใช้คำสั่ง update-alternate เพื่อให้สามารถสลับระหว่างเวอร์ชันได้อย่างง่ายดาย สามารถกำหนดค่าได้ด้วย:

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

7

หากใช้cmakeสำหรับฉันไม่มีการแฮ็กในการแก้ไขไฟล์และการเชื่อมโยงใด ๆ ฉันจึงรวบรวมโดยใช้แฟล็กที่ระบุเวอร์ชัน gcc / g ++
cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 ..

ทำงานอย่างมีเสน่ห์


ฮ่าฮ่าฉันจะพยายามเชื่อมโยงคำตอบของคุณจากคำถามอื่นที่นี่เพราะฉันคิดว่ามันจำเป็นต้องใส่ในหัวข้อนี้ งานดีอีกแล้ว! ขอบคุณ
MikeDoho

ควรละเว้นจากการโพสต์คำตอบที่ซ้ำกันใน SO แต่ฉันไม่มีตัวเลือก :)
markroxor

5

ในการแจกแจงส่วนใหญ่คุณมีความเป็นไปได้ที่จะติดตั้ง gcc และ g ++ เวอร์ชันอื่นข้างคอมไพเลอร์ล่าสุดเช่น gcc-4.7 นอกจากนี้ระบบบิวด์ส่วนใหญ่ยังทราบถึงตัวแปรสภาพแวดล้อมCCและCXXซึ่งให้คุณระบุคอมไพเลอร์ C และ C ++ อื่น ๆ ตามลำดับ ดังนั้นฉันขอแนะนำสิ่งต่างๆเช่น:

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

สำหรับ Makefiles ควรมีวิธีที่คล้ายกัน ฉันไม่แนะนำให้ตั้งค่า symlink ที่กำหนดเองภายใน / usr / local เว้นแต่คุณจะรู้ว่าคุณกำลังทำอะไรอยู่


3

สิ่งนี้ใช้ได้กับ fedora 23 ที่เก็บ gcc ที่เข้ากันได้จะแตกต่างกันเล็กน้อยตามเวอร์ชันของ fedora ของคุณ

หากคุณติดตั้งที่เก็บต่อไปนี้:

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

ตอนนี้ให้สร้างซอฟต์ลิงค์ตามที่กล่าวไว้ข้างต้นโดยสมมติว่ามีโฟลเดอร์ cuda bin ของคุณอยู่ /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++

ตอนนี้คุณควรจะคอมไพล์ได้nvccโดยไม่มีข้อผิดพลาดเวอร์ชัน gcc


2

โซลูชันของ Gearoid Murphy ทำงานได้อย่างมีเสน่ห์ สำหรับฉันฉันมีสองไดเรกทอรีสำหรับ cuda -

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

ต้องเพิ่มซอฟต์ลิงก์ลงในไดเร็กทอรีที่ระบุไว้ด้านล่างเท่านั้น -

/usr/local/cuda 

นอกจากนี้จำเป็นต้องมีทั้งซอฟต์ลิงก์ g ++ และ gcc ตามที่ SchighSchagh กล่าวไว้


2

อีกวิธีหนึ่งในการกำหนดค่า nvcc เพื่อใช้ gcc เวอร์ชันเฉพาะ (ตัวอย่างเช่น gcc-4.4) คือการแก้ไขnvcc.profileและแก้ไขPATHเพื่อรวมพา ธ ไปยัง gcc ที่คุณต้องการใช้ก่อน

ตัวอย่างเช่น (gcc-4.4.6 ติดตั้งใน / 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_):

ตำแหน่งของnvcc.profileแตกต่างกันไป แต่ควรอยู่ในไดเร็กทอรีเดียวกับที่เรียกใช้งานnvccเอง

นี่เป็นการแฮ็กเล็กน้อยเนื่องจากnvcc.profileไม่ได้มีไว้สำหรับการกำหนดค่าผู้ใช้ตามคู่มือ nvcc แต่เป็นโซลูชันที่ทำงานได้ดีที่สุดสำหรับฉัน


ฉันขอแนะนำให้ทำสิ่งนี้ แต่ชี้เส้นทางไปยังไดเร็กทอรีที่มี g ++ เชื่อมโยงกับเวอร์ชัน gcc ที่ถูกต้อง (มีประโยชน์อย่างยิ่งหากการแจกจ่ายของคุณมีเวอร์ชัน gcc ที่รองรับ) ตัวอย่างเช่น:mkdir /usr/local/bin/cuda-hack && ln -s /usr/bin/g++-5 /usr/local/bin/cuda-hack
Sami Liedes


2

สำหรับคนอย่างผมที่ทำให้เกิดความสับสนในขณะที่ใช้cmakeในสคริปต์แทนที่บางสิ่งจากFindCUDA.cmake nvcc.profileคุณสามารถระบุnvccคอมไพเลอร์เป็นเจ้าภาพโดยการตั้งค่าCUDA_HOST_COMPILERตาม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/gccฉันติดตั้ง gromac ที่รองรับ GPU เรียบร้อยแล้ว
pengchy

2

ฉันต้องติดตั้ง gcc, g ++ เวอร์ชันเก่ากว่า

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

ตรวจสอบว่า gcc-4.4 อยู่ใน / usr / bin / และเหมือนกันสำหรับ g ++ จากนั้นฉันสามารถใช้วิธีแก้ปัญหาด้านบน:

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

เมื่อฉันลองใช้คำสั่งนี้มันขึ้นว่า "มีไฟล์อยู่" และไม่มีการเชื่อมโยง ความช่วยเหลือใด ๆ
Sentient07

ฉันกลัวว่าจะห่างไกลจากการคิดเรื่องนี้มากเกินไปที่จะไม่รู้ว่าจะพูดอะไร หวังว่าคนอื่นจะช่วยได้
travelingbones

2

ใน$CUDA_HOME/include/host_config.hค้นหาบรรทัดเหล่านี้ (อาจแตกต่างกันเล็กน้อยระหว่าง CUDA เวอร์ชันต่างๆ):

//...
#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) <]
//...

ลบหรือเปลี่ยนแปลงให้ตรงกับเงื่อนไขของคุณ

โปรดทราบว่าวิธีนี้อาจไม่ปลอดภัยและอาจทำให้บิวด์ของคุณเสียหายได้ ตัวอย่างเช่น gcc 5 ใช้ C ++ 11 เป็นค่าเริ่มต้นอย่างไรก็ตามนี่ไม่ใช่กรณีสำหรับ nvcc ตาม CUDA 7.5 วิธีแก้ปัญหาคือการเพิ่ม

--Xcompiler="--std=c++98" สำหรับ CUDA <= 6.5

หรือ

--std=c++11 สำหรับ CUDA> = 7.0


เราจะเพิ่ม--std=c++ตัวเลือกไปที่ใด
asgs

1

หากคุณพบข้อผิดพลาดนี้โปรดอ่านไฟล์บันทึก:

$ 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.

เพียงทำตามคำแนะนำในไฟล์บันทึก:

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

งานเสร็จแล้ว :)

ฉันเพิ่งติดตั้ง CUDA 10.2 พร้อม gcc 9.2 บน Kubuntu 19.10 โดยใช้--overrideตัวเลือก


0

ในการรวบรวมตัวอย่าง CUDA 8.0 บน Ubuntu 16.10 ฉันทำ:

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

สิ่งนี้มีข้อดีของการไม่แก้ไขทั้งระบบหรือสร้าง symlink ให้เป็นเพียงไบนารี (ซึ่งอาจทำให้เกิดปัญหาในการเชื่อมโยงไลบรารี)


0

สิ่งนี้ช่วยแก้ปัญหาของฉัน:

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

สำหรับ CUDA 6.5 (และเห็นได้ชัดว่าเป็น 7.0 และ 7.5) ฉันได้สร้างแพ็คเกจ gcc 4.8.5 RPM (ภายใต้ Fedora Core 30) ที่อนุญาตให้ติดตั้ง gcc เวอร์ชันนั้นควบคู่ไปกับ GCC ปัจจุบันของระบบของคุณ

คุณสามารถค้นหาข้อมูลทั้งหมดที่นี่


0

ในกรณีของฉันฉันติดตั้ง CUDA จากเวอร์ชัน Ubuntu แล้วและ cmake จะตรวจพบสิ่งนั้นแทนที่จะเป็นเวอร์ชันที่ติดตั้งใหม่โดยใช้ NVidia SDK Manager

ฉันวิ่ง dpkg -l | grep cudaและสามารถดูทั้งสองเวอร์ชัน

สิ่งที่ฉันต้องทำคือถอนการติดตั้ง CUDA เก่า (เวอร์ชัน 9.1 ในกรณีของฉัน) และปล่อยเวอร์ชันใหม่ไว้คนเดียว (เวอร์ชัน 10.2) ฉันใช้คำสั่ง purge ดังนี้:

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

โปรดตรวจสอบว่าชื่อแพ็กเกจตรงกับเวอร์ชันที่คุณต้องการลบออกจากการติดตั้งของคุณ

ฉันต้องรันใหม่cmakeจากBUILDไดเร็กทอรีว่างเพื่อเปลี่ยนเส้นทาง#includeและไลบรารีทั้งหมดไปยังเวอร์ชัน SDK (เนื่องจากพา ธ เก่าถูกอบในสภาพแวดล้อมการสร้างที่มีอยู่)


-1

สิ่งนี้เกิดขึ้นเนื่องจากเวอร์ชัน CUDA ปัจจุบันของคุณไม่รองรับเวอร์ชัน GCC ปัจจุบันของคุณ คุณต้องดำเนินการดังต่อไปนี้:

  1. ค้นหาเวอร์ชัน GCC ที่รองรับ (ในกรณีของฉันคือ 5 สำหรับ 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. ติดตั้ง GCC เวอร์ชันที่รองรับ

    sudo apt-get install gcc-5
    sudo apt-get install g++-5
    
  3. เปลี่ยนซอฟต์ลิงก์สำหรับ GCC ใน/usr/binไดเร็กทอรี

    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. เปลี่ยนซอฟต์ลิงก์สำหรับ GCC ใน/usr/local/cuda-9.0/binไดเร็กทอรี

    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. เพิ่ม-DCUDA_HOST_COMPILER=/usr/bin/gcc-5ลงในsetup.pyไฟล์ของคุณใช้สำหรับการคอมไพล์

    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. ลบไดเร็กทอรี build เก่า

    rm -rd build/
    
  7. คอมไพล์อีกครั้งโดยตั้งค่า CUDAHOSTCXX=/usr/bin/gcc-5

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

หมายเหตุ: หากคุณยังคงได้รับgcc: error trying to exec 'cc1plus': execvp: no such file or directoryข้อผิดพลาดหลังจากทำตามขั้นตอนเหล่านี้แล้วให้ลองติดตั้ง GCC ใหม่เช่นนี้แล้วรวบรวมอีกครั้ง:

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

เครดิต: https://github.com/facebookresearch/maskrcnn-benchmark/issues/25#issuecomment-433382510

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.