Компилятор Cuda не работает с GCC 4.5 +

Я новичок в Cuda, и я пытаюсь скомпилировать этот простой test_1.cu файл:

#include <stdio.h>

__global__ void kernel(void)
{
}

int main (void)
{
    kernel<<<1,1>>>();
    printf( "Hello, World!\n");
    return 0;

}

используя это: nvcc test_1.cu

Я получаю вывод:

In file included from /usr/local/cuda/bin/../include/cuda_runtime.h:59:0,
                 from <command-line>:0:
/usr/local/cuda/bin/../include/host_config.h:82:2: error: #error -- unsupported GNU version! gcc 4.5 and up are not supported!

мой gcc - версия

gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Copyright (C) 2011 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.

Как я могу установить вторую версию gcc (4.4 -) вместе с 4.6 без всяких проблем?

Я нашел эту старую тему:

CUDA несовместима с моей версией gcc

ответ был:

GCC 4.5 и 4.6 не поддерживаются с CUDA - код не будет компилироваться, а остальная часть набора инструментов, включая cuda-gdb, не будет работать должным образом. Вы не можете использовать их, и ограничение не подлежит обсуждению.

Ваше единственное решение - установить версию gcc 4.4 в качестве второго компилятора (большинство дистрибутивов позволяют это). Существует опция nvcc --compiler-bindir, которая может использоваться для указания на альтернативный компилятор. Создайте локальный каталог и создайте символические ссылки на поддерживаемые исполняемые файлы версии gcc. Передайте этот локальный каталог в nvcc с помощью параметра --compiler-bindir, и вы сможете скомпилировать код CUDA, не затрагивая остальную часть вашей системы.

Но я понятия не имею, как это сделать

5 ответов

Решение

Проведение некоторых онлайн-исследований показывает несколько методов выполнения этой задачи. Я только что проверил метод, найденный здесь: http://www.vectorfabrics.com/blog/item/cuda_4.0_on_ubuntu_11.04 и он сработал для меня. Это пошаговое руководство по установке gcc 4.4 и созданию сценариев для запуска этой версии с nvcc. Если вы предпочитаете попробовать метод, упомянутый в вашем посте, я бы рекомендовал перейти по этой первой ссылке для установки gcc4.4, а затем создать символические ссылки, как указано в вашем посте. Создание символических ссылок в Linux выполняется с помощью команды 'ln'.

Например:

 ln -s [source file/folder path] [linkpath]

Эта ссылка дает несколько примеров создания символических ссылок как в Ubuntu, так и в Windows: http://www.howtogeek.com/howto/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/, Надеюсь, это указывает на правильное направление.

В моем случае у меня не было прав root, поэтому я не мог полностью заменить текущую версию gcc (4.7) более старой версией 4.4 (что, я думаю, было бы плохой альтернативой). Хотя у меня были права на установку CUDA. Мое решение состояло в том, чтобы создать дополнительную папку (например, /somepath/gccfornvcc/), где бы у меня не было прав, затем создать ссылку на принятый nvcc компилятор. У меня уже был доступен gcc 4.4 (но вы можете установить его, не удаляя текущую версию).

ln -s [path to gcc 4.4]/gcc-4.4 /somepath/gccfornvcc/gcc

Затем в той же папке, где находится двоичный файл nvcc, вы должны найти файл с именем nvcc.profile. Там вам просто нужно добавить следующую строку:

compiler-bindir = /somepath/gccfornvcc

И это заставит nvcc использовать правильный компилятор. Это помогает поддерживать систему в надлежащем состоянии, поддерживать новейший компилятор, но nvcc (только nvcc) будет использовать старую версию компилятора.

Я полагаю, вы можете попробовать новую бета-версию, основанную на LLVM.

Ссылка: я обновляю свой gcc с 4.4 до 4.6. Тогда я не мог использовать nvcc для компиляции моего кода. К счастью, с помощью метода, предоставленного по следующей ссылке. Я установил свой компилятор gcc по умолчанию обратно на gcc 4.4. Теперь я могу скомпилировать файл, используя gcc4.4 или gcc4.6. выйти круто http://ubuntuguide.net/how-to-install-and-setup-gcc-4-1g4-1-in-ubuntu-10-0410-10

Еще один способ сделать nvcc работать с компилятором не по умолчанию (в отличие от ответа @Sluml, он обеспечивает большую гибкость):

Сначала, так же как и @Slump, вам нужно создать каталог ~/local/gcc-4.4/и затем создайте там символические ссылки для правильных версий gcc: for i in gcc gxx; do ln -s /usr/bin/${i}-4.4 ~/local/cudagcc/${i}; done, Теперь, когда вы бежите nvcc -ccbin ~/local/gcc-4.4/ ... nvcc будет использовать правильные версии gcc.

Вот небольшой фрагмент CMake, заставляющий nvcc использовать определенный компилятор хоста.

option (CUDA_ENFORCE_HOST_COMPILER "Force nvcc to use the same compiler used to compile .c(pp) files insted of gcc/g++" OFF)
if (${CUDA_ENFORCE_HOST_COMPILER})
  set (CMAKE_GCC_TEMP_DIR "CMakeGCC")
  file(MAKE_DIRECTORY ${CMAKE_GCC_TEMP_DIR})
  execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_C_COMPILER} ${CMAKE_GCC_TEMP_DIR}/gcc)
  execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CXX_COMPILER} ${CMAKE_GCC_TEMP_DIR}/g++)
  set(CUDA_NVCC_FLAGS -ccbin ${CMAKE_GCC_TEMP_DIR} ${CUDA_NVCC_FLAGS})
endif()
Другие вопросы по тегам