Linux Cuda编译器不适用于GCC 4.5+;

Linux Cuda编译器不适用于GCC 4.5+;,linux,gcc,ubuntu,cuda,nvidia,Linux,Gcc,Ubuntu,Cuda,Nvidia,我是Cuda的新手,我正在尝试编译这个简单的test_1.cu文件: #include <stdio.h> __global__ void kernel(void) { } int main (void) { kernel<<<1,1>>>(); printf( "Hello, World!\n"); return 0; } 我的gcc——版本: gcc (Ubuntu/Linaro 4.6.1-9ubuntu3)

我是Cuda的新手,我正在尝试编译这个简单的
test_1.cu
文件:

#include <stdio.h>

__global__ void kernel(void)
{
}

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

}
我的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 4.5和4.6-代码不会编译和删除 工具链的其余部分,包括cuda gdb,将无法正常工作。 您不能使用它们,并且限制是不可协商的

您唯一的解决方案是将GCC4.4版本作为第二个版本安装 编译器(大多数发行版都允许)。我们可以选择 nvcc——编译器bindir,可用于指向另一个选项 编译器。创建一个本地目录,并创建指向 支持的gcc版本可执行文件。将该本地目录传递给nvcc 通过--compiler bindir选项,您应该能够编译 CUDA代码不会影响系统的其余部分


但是我不知道怎么做

在网上做一些研究显示了完成这项任务的几种方法。我刚刚测试了这里找到的方法:它对我来说就像一个符咒。它将引导您安装GCC4.4,并创建脚本以使用nvcc运行该版本。如果你喜欢尝试文章中提到的方法,我建议你按照第一个链接安装gcc4.4,然后按照文章中提到的方法创建符号链接。在Linux中创建符号链接是通过使用'ln'命令完成的

例如:

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

此链接给出了在Ubuntu和Windows上创建符号链接的几个示例:。希望这能为您指明正确的方向。

我想您可以尝试一下,基于LLVM。

另一种让
nvcc
使用非默认编译器的方法(与@Sluml的答案不同,它允许更大的灵活性):

首先,就像@glump一样,您需要创建目录
~/local/gcc-4.4/
,然后为gcc的正确版本创建符号链接:
用于gcc gxx中的i;do ln-s/usr/bin/${i}-4.4~/local/cudagcc/${i};完成
。现在,当您运行
nvcc-ccbin~/local/gcc-4.4/…
nvcc将使用正确版本的gcc

下面是强制nvcc使用特定主机编译器的小CMake片段

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()
参考: 我将gcc从4.4更新到4.6。然后我不能使用nvcc来编译我的代码。幸运的是,通过使用以下链接提供的方法。我将默认的gcc编译器设置回GCC4.4。现在,我可以使用gcc4.4或gcc4.6编译文件。冷静点

在我的例子中,我没有根权限,因此我无法用旧版本4.4(我认为这是一个糟糕的替代品)完全替换当前的gcc(4.7)。虽然我确实拥有安装CUDA的权限。我的解决方案是在我有权限的地方创建一个额外的文件夹(例如/somepath/gccfornvcc/),然后创建一个指向nvcc接受的编译器的链接。我已经有了GCC4.4(但您可以安装它,而无需删除当前版本)

然后,在nvcc二进制文件所在的文件夹中,您应该找到一个名为nvcc.profile的文件。在这里,您只需添加以下行:

compiler-bindir = /somepath/gccfornvcc

这将使nvcc使用正确的编译器。这有助于保持系统处于正确状态,保持最新的编译器,但nvcc(仅nvcc)将使用旧的编译器版本。

不完全正确。GCC4.5运行良好。它要求您注释掉头文件中生成代码的错误。gcc 4.6是cuda 4.0不支持的另一个问题。不过,我希望新的cuda 4.1(将于1月初发布)将与4.6兼容
ln -s [path to gcc 4.4]/gcc-4.4 /somepath/gccfornvcc/gcc
compiler-bindir = /somepath/gccfornvcc