【问题标题】:Cuda compiler not working with GCC 4.5 +Cuda 编译器不适用于 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 兼容

标签: linux gcc ubuntu cuda nvidia


【解决方案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

          【讨论】:

            猜你喜欢
            • 2015-02-25
            • 1970-01-01
            • 2014-05-11
            • 2011-12-06
            • 1970-01-01
            • 2014-08-23
            • 2021-07-28
            • 1970-01-01
            相关资源
            最近更新 更多