2013-06-22 4 views
1

Я установил инструментарий CUDA на свой компьютер, но что-то кажется сломанным. nvcc не удалось собрать, ни простой привет-мир, как это:nvcc не удалось скомпилировать

#include <stdio.h> 

int main(int argc, char** argv) { 
    printf("Hello, world!\n"); 
    return 0; 
} 

Выход:

$ nvcc hello.cu 
/usr/include/c++/4.8.0/cstdlib(178): error: identifier "__int128" is undefined 
/usr/include/c++/4.8.0/cstdlib(179): error: identifier "__int128" is undefined 

2 errors detected in the compilation of "/tmp/tmpxft_000011a2_00000000-6_hello.cpp1.ii". 

многословным выход:

$ nvcc --verbose hello.cu 
#$ _SPACE_= 
#$ _CUDART_=cudart 
#$ _HERE_=/opt/cuda/bin 
#$ _THERE_=/opt/cuda/bin 
#$ _TARGET_SIZE_=64 
#$ TOP=/opt/cuda/bin/.. 
#$ LD_LIBRARY_PATH=/opt/cuda/bin/../lib: 
#$ PATH=/opt/cuda/bin/../open64/bin:/opt/cuda/bin/../nvvm:/opt/cuda/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/android-sdk/platform-tools:/opt/android-sdk/tools:/opt/android-studio/bin:/opt/cuda/bin:/extra/usr/bin:/opt/java/bin:/opt/java/db/bin:/opt/java/jre/bin:/usr/bin/core_perl:/usr/lib/smlnj/bin:.:. 
#$ INCLUDES="-I/opt/cuda/bin/../include" 
#$ LIBRARIES= "-L/opt/cuda/bin/../lib64" -lcudart 
#$ CUDAFE_FLAGS= 
#$ OPENCC_FLAGS= 
#$ PTXAS_FLAGS= 
#$ gcc -D__CUDA_ARCH__=100 -E -x c++ -DCUDA_FLOAT_MATH_FUNCTIONS -DCUDA_NO_SM_11_ATOMIC_INTRINSICS -DCUDA_NO_SM_12_ATOMIC_INTRINSICS -DCUDA_NO_SM_13_DOUBLE_INTRINSICS -D__CUDACC__ -D__NVCC__ "-I/opt/cuda/bin/../include" -include "cuda_runtime.h" -m64 -o "/tmp/tmpxft_000011e1_00000000-6_hello.cpp1.ii" "hello.cu" 
#$ cudafe --m64 --gnu_version=40800 -tused --no_remove_unneeded_entities --gen_c_file_name "/tmp/tmpxft_000011e1_00000000-3_hello.cudafe1.c" --stub_file_name "/tmp/tmpxft_000011e1_00000000-3_hello.cudafe1.stub.c" --gen_device_file_name "/tmp/tmpxft_000011e1_00000000-3_hello.cudafe1.gpu" --nv_arch "compute_10" --gen_module_id_file --module_id_file_name "/tmp/tmpxft_000011e1_00000000-2_hello.module_id" --include_file_name "tmpxft_000011e1_00000000-1_hello.fatbin.c" "/tmp/tmpxft_000011e1_00000000-6_hello.cpp1.ii" 
/usr/include/c++/4.8.0/cstdlib(178): error: identifier "__int128" is undefined 

/usr/include/c++/4.8.0/cstdlib(179): error: identifier "__int128" is undefined 

2 errors detected in the compilation of "/tmp/tmpxft_000011e1_00000000-6_hello.cpp1.ii". 
# --error 0x2 -- 

Некоторая информация о моей system:

ОС - это Chakra Linux (дистрибутив на базе Arch) 64 бит. В настоящее время я использую GCC-многобиблиотечный версии:

$ gcc -v 
Using built-in specs. 
COLLECT_GCC=gcc 
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.0/lto-wrapper 
Target: x86_64-unknown-linux-gnu 
Configured with: /chakra/lib32-testing/gcc-multilib/src/gcc-4.8-20130411/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://chakra-project.org/bugs --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --enable-gnu-unique-object --enable-linker-build-id --enable-cloog-backend=isl --disable-cloog-version-check --enable-lto --enable-gold --enable-ld=default --enable-plugin --with-plugin-ld=ld.gold --with-linker-hash-style=gnu --disable-install-libiberty --enable-multilib --disable-libssp --disable-werror --enable-checking=release 
Thread model: posix 
gcc version 4.8.0 20130411 (prerelease) (GCC) 

Информация о CUDA Toolkit:

$ nvcc --version 
nvcc: NVIDIA (R) Cuda compiler driver 
Copyright (c) 2005-2012 NVIDIA Corporation 
Built on Fri_Sep_21_17:28:58_PDT_2012 
Cuda compilation tools, release 5.0, V0.2.1221 

И последнее, но не в последнюю очередь, это является проблематичным заголовочный файл: http://pastebin.com/WtUckrYv

Спасибо авансовый.

ответ

8

CUDA 5.0 не совместим с gcc 4.8.0.

Для лучшего понимания совместимых версий дистрибутивов и gcc обратитесь к release notes.

Возможно, вам повезло с cuda 5.5 RC, но этот конкретный дистрибутив, а также указанная вами версия gcc по-прежнему не указана в release notes под поддержкой linux.

Наилучший опыт, скорее всего, можно найти, переключившись на поддерживаемый дистрибутив.

Обычно nvcc в CUDA 5 будет автоматически включать файл /usr/local/cuda/include/host_config.h, который имеет различные макросы для проверки правильности приемлемых версий/компилятора, и один из этих макросов должны быть выброшена ошибка в вашем случае, но мне кажется, это не так:

#if defined(__GNUC__) 

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

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

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

#endif /* __GNUC__ */ 
+0

О, это очень раздражает, но спасибо. В моей системе у меня нет этого файла, и, вероятно, это признак плохой установки ... – eang

+0

Кстати, я постараюсь установить CUDA на Windows. CUDA 5.5 должен поддерживать Visual Studio 2012, правильно? – eang

+2

Да, CUDA 5.5 должен поддерживать VS2012. Для простой настройки убедитесь, что VS2012 установлен на вашем компьютере, прежде чем запускать установщик CUDA 5.5. И, конечно же, CUDA 5.5 по-прежнему находится на стадии RC (релиз), поэтому сейчас это похоже на «бета». –

0

Это решение, которое, по крайней мере, работало для меня. У меня установлены cuda 5.0 и gcc 4.8.

Вы просто должны добавить:

#undef _GLIBCXX_USE_INT128 

just before line #129: 

#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_INT128) 

в файле /usr/include/c++/4.8.1/cstdlib

Делая это, я мог бы составить свой код.

+8

Я бы * никогда не рекомендовал изменять системные заголовки, чтобы заставить CUDA работать с неподдерживаемой версией компилятора. Потенциал проблем при компиляции кода, отличного от CUDA, огромен. – talonmies

1

Если у вас возникли проблемы с gcc-4.7 + даже с cuda-5.5, проверьте, установлена ​​ли у вас более старая версия nvidia-cuda-toolkit, я очистил все материалы nvdia-cuda- *, и все прошло отлично. cuda-5.5 (у меня был gcc-4.8.1)

1

В моем случае ошибка была там, только если я попытался скомпилировать с использованием llvm в качестве back-end, т.е.:

nvcc -ccbin=/usr/bin/clang -arch=sm_20 -m64 main.cu 

Так после изучения упомянутого выше заголовка я добавил:

-D__STRICT_ANSI__ 

Так последняя команда компиляции выглядела так:

nvcc -ccbin=/usr/bin/clang -arch=sm_20 -m64 main.cu -D__STRICT_ANSI__ 

Я посмотрел на лязг Дев форумах, и это выглядит как это известная проблема, но я не копал глубоко.

Надеюсь, это поможет.