2014-02-07 176 views
-1

为什么当我尝试编译cuda程序时会抛出这些错误:clang: error: unsupported option '-dumpspecs'clang: error: no input filesCUDA NVCC编译器错误

我在终端上输入:nvcc -o hello matrix_product.cu作为一个互联网教程给我看,但似乎没有工作......我必须添加一些变量或类似的东西?

而且file.cu的代码是:

using namespace std; 

void CheckCudaError(string &e); 


__global__ void productMatrix(int *matrix_a, int *matrix_b, int *matrix_c) 
{ 

    int blockidx = blockIdx.x; 
    int blockidy = blockIdx.y; 

    int threadx = threadIdx.x; 
    int thready = threadIdx.y; 

    __shared__ int Asub[BLOCK_SIZE][BLOCK_SIZE]; 
    __shared__ int Bsub[BLOCK_SIZE][BLOCK_SIZE]; 

    Asub[threadx][thready] = matrix_a[blockidx * BLOCK_SIZE + threadx + blockidy * BLOCK_SIZE + thready]; 
    Bsub[threadx][thready] = matrix_b[blockidx * BLOCK_SIZE + threadx + blockidy * BLOCK_SIZE + thready]; 

    __syncthreads(); 

    int suma; 

    for (int i = 0; i < BLOCK_SIZE; ++i) 
    { 
     suma += Asub[e][thready]* Bsub[threadx][e]; 
    } 

    __syncthreads(); 

    matrix_c[blockidx * BLOCK_SIZE + threadx + blockidy * BLOCK_SIZE + thready] = suma; 


} 


int main(){ 

    //Creamos punteros para apuntar tanto al dispositivo como a memoria. 
    int *h_a, *h_b; 
    int *d_a, *d_b, *d_c; 

    int NumBlocks = 100 * 100/BLOCK_SIZE; 
    int num_elements = NumBlocks * BLOCK_SIZE; 


    //Apuntamos los punteros hacia un espacio de 100*100 elementos en el host 
    h_a = malloc(num_elements * sizeof(int)); 
    h_b = malloc(num_elements * sizeof(int)); 
    CheckCudaError("malloc_host_error"); 


    //LLenamos la memoria 
    for (int i = 0; i < num_elements; ++i) 
    { 
     h_a[i] = i; 
     h_b[i] = num_elements - 1 - i; 
    } 


    //Apuntamos los punteros del dispositivo hacia una reserva de memoria de 100*100 elementos. 
    cudaMalloc(&d_a, num_elements * sizeof(int)); 
    cudaMalloc(&d_b, num_elements * sizeof(int)); 
    cudaMalloc(&d_c, num_elements * sizeof(int)); 
    CheckCudaError("malloc_device_error"); 


    /*Copiamos los elementos del host ya llenados anteriormente (llenamos memoria, 
     copiando las matrizes del host hacia la tarjeta gráfica (device).*/ 
    cudaMemcpy(d_a, h_a, num_elements * sizeof(int), cudaMemcpyHostToDevice); 
    cudaMemcpy(d_b, h_b, num_elements * sizeof(int), cudaMemcpyHostToDevice); 
    CheckCudaError("memcpy_error"); 


    free(h_b); 
    CheckCudaError("Free_host_error"); 


    //Establecemos el num de threas y blocks que utilizaremos 
    dim3 gridDim (NumBlocks, NumBlocks); 
    dim3 blockDim (BLOCK_SIZE, BLOCK_SIZE); 
    //LLamamos la función. 
    productMatrix <<< gridDim, blockDim >>> (d_a, d_b, d_c); 
    CheckCudaError("Calling_device_function_error"); 


    /*Esperamos a que todos los threads hayan hecho su trabajo (multiplicar las matrizes) 
     antes de copy back.*/ 
    cudaThreadSyncronize(); 
    CheckCudaError("Syncronize_threads_error"); 


    //Una vez sincronizados los volvemos a copiar hacia el host. 
    cudaMemcpy(h_a, d_c, num_elements * sizeof(int), cudaMemcpyDeviceToHost); 
    CheckCudaError("mempcy_host_error"); 


    //Imprimimos por pantalla 
    for (int i = 0; i < num_elements; ++i) cout << h_a[i]; 


    //Aliberamos memoria en el device 
    cudaFree(d_a); 
    cudaFree(d_b); 
    cudaFree(d_c); 

    //Aliveramos meomria en host. 
    free(h_a); 

    CheckCudaError("free_device_error"); 

} 


void CheckCudaError(string &e) 
{ 
    //Obtenemos el ultimo error. 
    cudaError_t err = cudaGetLastError(); 
    //Si hay error imprime el error por pantalla 
    if(cudaSuccess != err){ 
     cout << e << endl; 
    } 
} 
+1

似乎NVCC要求系统编译器(GCC),了解系统信息( -dumpspecs),但你有一些叫做ngng假装gcc和失败。我确定nvidia有你的指示,但是你可以尝试在PATH前添加一个包含真实gcc的目录。 –

+1

Dup http://stackoverflow.com/q/19649541/1918193这已经是一个重复... –

回答

1

请尽量明确地指出NVCC到铛编译器。

NVCC := nvcc -ccbin /usr/bin/clang 

也许

NVCC := nvcc -ccbin /usr/local/cuda/bin/clang 

另外也别忘添加所有必要包括:

nvcc -I/usr/local/cuda-5.0/include -I. -I.. -I../../common/inc -o MonteCarlo_kernel.o -c MonteCarlo_kernel.cu 
+0

这与问题完全没有关系。如何指定包含文件可能会改变错误'clang:error:unsupported option'-dumpspecs''? (并注意编译器是叮当声,而不是gcc,你使用的是铿锵声吗?) – talonmies

+0

好吧,现在你已经编辑了问题的*精确原因*作为解决方案,这与你的第一个答案同样错误。这里的要点是,nvcc会尝试确定主机编译器是gcc还是clang,但是要做到这一点,它必须明确指向clang,而不是gcc的符号链接,这正是问题的根本原因以及你的答案将会做什么。 – talonmies

+0

@talonmies更正,请检阅 – 4pie0