CUDA和gcc兼容性问题

我得到这个错误

/usr/local/cuda-5.0/bin/../include/host_config.h:82:2:error:#error – 不受支持的GNU版本! gcc 4.7和以上不支持! make: * [src / Throughput.o]错误1

在host_config.h中,它们确保兼容性达到4.6

#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6) #error -- unsupported GNU version! gcc 4.7 and up are not supported! 

我有4.6和4.7

elect-elect-desktop:/usr/local/cuda-5.0/bin$ gcc gcc
gcc-4.7 gcc-nm-4.7 gcc-4.6 gcc-ar-4.7
GCC-ranlib的-4.7

在互联网上看,他们build议添加一个链接到cuda bin目录中的gcc-4.6。

所以我做了

elect-elect-desktop:/usr/local/cuda-5.0/bin$ sudo ln -s /usr/bin/gcc-4.6 gcc

而我又有一个错误

 **** Build of configuration Debug for project Throughput **** make all Building file: ../src/Throughput.cu Invoking: NVCC Compiler nvcc -G -g -O0 -gencode arch=compute_20,code=sm_20 -odir "src" -M -o "src/Throughput.d" "../src/Throughput.cu" gcc: error trying to exec 'cc1plus': execvp: No such file or directory make: *** [src/Throughput.o] Error 1 **** Build Finished **** 

再次谷歌search没有带来一些明确的情况下(海湾合作委员会降级等)

所以我在这里问这是什么现在的问题,因为CUDA应该与gcc-4.6兼容…

我的系统:

  • Ubuntu 12.10 64b
  • cuda_5.0.35_linux_64_ubuntu11.10-1

这是我正在尝试编译的教程代码

 /** * Copyright 1993-2012 NVIDIA Corporation. All rights reserved. * * Please refer to the NVIDIA end user license agreement (EULA) associated * with this source code for terms and conditions that govern your use of * this software. Any use, reproduction, disclosure, or distribution of * this software and related documentation outside the terms of the EULA * is strictly prohibited. */ #include <stdio.h> #include <stdlib.h> static const int WORK_SIZE = 256; /** * This macro checks return value of the CUDA runtime call and exits * the application if the call failed. */ #define CUDA_CHECK_RETURN(value) { \ cudaError_t _m_cudaStat = value; \ if (_m_cudaStat != cudaSuccess) { \ fprintf(stderr, "Error %s at line %d in file %s\n", \ cudaGetErrorString(_m_cudaStat), __LINE__, __FILE__); \ exit(1); \ } } __device__ unsigned int bitreverse(unsigned int number) { number = ((0xf0f0f0f0 & number) >> 4) | ((0x0f0f0f0f & number) << 4); number = ((0xcccccccc & number) >> 2) | ((0x33333333 & number) << 2); number = ((0xaaaaaaaa & number) >> 1) | ((0x55555555 & number) << 1); return number; } /** * CUDA kernel function that reverses the order of bits in each element of the array. */ __global__ void bitreverse(void *data) { unsigned int *idata = (unsigned int*) data; idata[threadIdx.x] = bitreverse(idata[threadIdx.x]); } /** * Host function that prepares data array and passes it to the CUDA kernel. */ int main(void) { void *d = NULL; int i; unsigned int idata[WORK_SIZE], odata[WORK_SIZE]; for (i = 0; i < WORK_SIZE; i++) idata[i] = (unsigned int) i; CUDA_CHECK_RETURN(cudaMalloc((void**) &d, sizeof(int) * WORK_SIZE)); CUDA_CHECK_RETURN(cudaMemcpy(d, idata, sizeof(int) * WORK_SIZE, cudaMemcpyHostToDevice)); bitreverse<<<1, WORK_SIZE, WORK_SIZE * sizeof(int)>>>(d); CUDA_CHECK_RETURN(cudaThreadSynchronize()); // Wait for the GPU launched work to complete CUDA_CHECK_RETURN(cudaGetLastError()); CUDA_CHECK_RETURN(cudaMemcpy(odata, d, sizeof(int) * WORK_SIZE, cudaMemcpyDeviceToHost)); for (i = 0; i < WORK_SIZE; i++) printf("Input value: %u, device output: %u\n", idata[i], odata[i]); CUDA_CHECK_RETURN(cudaFree((void*) d)); CUDA_CHECK_RETURN(cudaDeviceReset()); return 0; } 

问题源于CUDA工具链无法找到有效的C ++编译器。 nvcc只是一个编译器驱动程序,它需要一个工作的C ++编译器来编译任何代码。

要做到这一点的最正确的方法(注意你使用的是不受支持的Linux版本,所以使用这个建议的风险自负)是建立一个本地目录,保存指向受支持的编译器套件的链接(这意味着匹配,支持的gcc版本和g ++),并在编译时将--compiler-bindir参数传递给nvcc 。 例如:

 $ ls -l $HOME/cuda/bin total 16 lrwxr-xr-x 1 talonmies koti 16 Feb 9 12:41 g++ -> /usr/bin/g++-4.2 lrwxr-xr-x 1 talonmies koti 16 Feb 9 12:41 gcc -> /usr/bin/gcc-4.2 

在这里,我有一组指向受支持的编译器的链接。 然后我可以这样编译:

 $ nvcc --compiler-bindir=$HOME/cuda/bin -c -arch=sm_12 -Xptxas="-v" nanobench.cu ptxas info : 0 bytes gmem ptxas info : Compiling entry function '_Z5benchIfLi128000EEvPjPT_i' for 'sm_12' ptxas info : Used 5 registers, 28 bytes smem, 12 bytes cmem[1] 

这可能是在不支持系统编译器的情况下使用替代编译器的最安全和侵入性最小的方法。

正如其他地方发现

 su -c 'update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 10' sudo update-alternatives --config gcc 

为我工作。 我正在编译CudaMiner。