Cuda 编译器不适用于 GCC 4.5 +

Posted

技术标签:

【中文标题】Cuda 编译器不适用于 GCC 4.5 +【英文标题】:Cuda compiler not working with GCC 4.5 + 【发布时间】:2012-01-25 18:46:01 【问题描述】:

我是 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 --version:

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 incompatible with my gcc version

答案是:

CUDA 不支持 gcc 4.5 和 4.6 - 代码无法编译和 工具链的其余部分,包括 cuda-gdb,将无法正常工作。 你不能使用它们,而且限制是不可协商的。

您唯一的解决方案是安装 gcc 4.4 版本作为第二个 编译器(大多数发行版都允许这样做)。有一个选项 nvcc --compiler-bindir 可用于指向替代方案 编译器。创建一个本地目录并生成指向该目录的符号链接 支持 gcc 版本的可执行文件。将该本地目录传递给 nvcc 通过 --compiler-bindir 选项,你应该能够编译 CUDA 代码而不影响系统的其余部分。

但我不知道该怎么做

【问题讨论】:

不完全正确。 gcc 4.5 工作得很好。它要求您从头文件中注释掉生成错误的代码。 gcc 4.6 是另一个 cuda 4.0 不支持的问题。但是我希望新的 cuda 4.1(将于 1 月初发布)将与 4.6 兼容 【参考方案1】:

在我的情况下,我没有 root 权限,所以我不能用旧版本 4.4 完全替换当前的 gcc (4.7)(我认为这是一个不好的选择)。尽管我确实拥有安装 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)将使用旧的编译器版本。

【讨论】:

【参考方案2】:

在线进行一些研究显示了完成此任务的几种方法。我刚刚测试了这里找到的方法: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/。希望这会为您指明正确的方向。

【讨论】:

【参考方案3】:

我想你可以试试the new, beta, version,它基于 LLVM。

【讨论】:

【参考方案4】:

使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。

这里是强制 nvcc 使用特定主机编译器的小 CMake sn-p。

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()

【讨论】:

【参考方案5】:

参考: 我将我的 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

【讨论】:

以上是关于Cuda 编译器不适用于 GCC 4.5 +的主要内容,如果未能解决你的问题,请参考以下文章

为啥异常不适用于 OSX 上的 gcc7 和 -static-libgcc?

宏调用中的 #ifdef 适用于 gcc,但不适用于 msvc

程序不适用于 C 中的大文件

用于解释自定义 c++11 属性的 Clang/GCC 插件

Jquery mobile getJSON 适用于浏览器但不适用于移动设备

模板专业化,Windows 与 gcc 上的不同行为?