2011-12-22 91 views
2

我是新来的Cuda的工作,我试图编译这个简单的test_1.cu文件:使用此Cuda的编译器不能与GCC 4.5 +

#include <stdio.h> 

__global__ void kernel(void) 
{ 
} 

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

} 

nvcc test_1.cu

我得到的输出是:

​​

我的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

答案是:

GCC 4.5和4.6不与CUDA的支持 - 代码不会编译和 的休息工具链(包括cuda-gdb)将无法正常工作。 你不能使用它们,限制是不可协商的。

你唯一的解决办法是安装一个GCC 4.4版作为第二 编译器(大多数发行版将允许)。有一个选项,其可以用来指向一个替代 编译 NVCC --compiler-BINDIR。创建一个本地目录和创建符号链接到 支持gcc版本的可执行文件。传递本地目录通过--compiler-BINDIR选项NVCC ,你应该能够编译 CUDA代码,而不影响系统的其余部分。

但我不知道该怎么做

+0

不完全如此。 gcc 4.5工作得很好。它要求你注释头文件中的错误生成代码。 gcc 4.6是cuda 4.0不支持的另一个问题。不过,我希望新的cuda 4.1(1月初到期)与4.6兼容 – 2011-12-22 16:17:05

回答

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/。希望这点能让你朝着正确的方向前进。

0

另一种方式让与非默认的编译器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片段。

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

在我的情况下,我没有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)将使用旧的编译器版本。