2013-02-09 14 views
7

ich diesen FehlerCUDA und gcc Kompatibilitätsproblem

/usr/local/cuda-5.0/bin/../include/host_config.h:82:2: error: #error -- unsupported GNU version! gcc 4.7 and up are not supported! make: * [src/Throughput.o] Error 1

Im host_config.h sie Kompatibilität sicherzustellen, auf die 4,6

#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6) 

#error -- unsupported GNU version! gcc 4.7 and up are not supported! 

up habe ich beide 4,6 und 4,7

[email protected]:/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

Mit Blick auf das Internet schlagen sie vor, einen Link zum gcc-4.6 im cuda bin Verzeichnis hinzuzufügen.

Also habe ich

[email protected]:/usr/local/cuda-5.0/bin$ sudo ln -s /usr/bin/gcc-4.6 gcc

Und ich bekomme einen anderen Fehler

**** 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 **** 

wieder googeln brachte mich nicht auf einige klare Situationen (gcc Herabstufung usw.)

Also ich bin frage hier, was nun das Problem ist, da CUDA mit gcc-4.6 kompatibel sein soll ...

Mein System:

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

Dies ist das Tutorial Code, den ich im Moment zu kompilieren versuchen

/** 
* 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; 
} 
+0

Abgesehen von der CUDA, handeln Sie mit reinem C-Code? Oder ist es vielleicht C++? – Bart

+0

@bart: nvcc benötigt einen funktionierenden unterstützten C++ Compiler – talonmies

+0

@Bart Im Moment pure C (ich habe etwas zusätzlichen Code hinzugefügt) – elect

Antwort

5

Das Problem liegt darin, dass die CUDA-Toolchain keinen gültigen C++ - Compiler finden kann. nvcc ist nur ein Compilertreiber, es erfordert einen funktionierenden C++ - Compiler, um beliebigen Code zu kompilieren.

Der beste Weg, dies zu tun [Hinweis, dass Sie eine nicht unterstützte Linux-Version verwenden, verwenden Sie diesen Rat auf eigene Verantwortung], ist ein lokales Verzeichnis einzurichten, das Links zu einer unterstützten Compiler-Suite enthält. unterstützte Versionen von gcc und g ++) und übergeben das --compiler-bindir Argument an nvcc, wenn Sie kompilieren. Zum Beispiel:

$ 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 

Hier habe ich eine Reihe von Links zu einem unterstützten Compiler. Ich kann dann wie folgt zusammenstellen:

$ 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] 

Dies ist wahrscheinlich die sicherste und am wenigsten invasive Art und Weise alternative Compiler zu verwenden, in denen die System-Compiler nicht unterstützt werden.

+0

Ok, aber wenn es heißt, dass gcc-4.6 kompatibel ist und ich schon gcc-4.6 habe, fehlt mir nur g ++ - 4.6, nein? – elect

+0

Ja, funktionierend, mir fehlte der Link zu g ++ - 4.6, ich habe es dann installiert und einen Link in /cuda-5.0/bin/g++ zu /usr/bin/g++-4.6 erstellt. Danke talonmies – elect

+0

Btw, können Sie mir einfach bestätigen, wenn die ursprünglichen g ++ - und gcc-Links jeweils auf/usr/bin/g ++ und/usr/bin/gcc zeigen? – elect

2

Wie an anderer Stelle gefunden:

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

für mich gearbeitet. Ich kompiliere CudaMiner aber.

Verwandte Themen