2011-05-13 45 views
8

這個程序看起來很好,但我仍然得到一個錯誤,一些建議?編譯Cuda時出錯 - 預期的小學表達式

計劃:

#include "dot.h" 
#include <cuda.h> 
#include <cuda_runtime.h> 
#include <stdio.h> 

int main(int argc, char** argv) 
{ 
    int *a, *b, *c; 
    int *dev_a, *dev_b, *dev_c; 
    int size = N * sizeof(int); 

    cudaMalloc((void**)&dev_a, size); 
    cudaMalloc((void**)&dev_b, size); 
    cudaMalloc((void**)&dev_c, sizeof(int)); 

    a = (int *)malloc (size); 
    b = (int *)malloc (size); 
    c = (int *)malloc (sizeof(int)); 

    random_ints(a, N); 
    random_ints(b, N); 

    cudaMemcpy(dev_a, a, size, cudaMemcpyHostToDevice); 
    cudaMemcpy(dev_b, b, size, cudaMemcpyHostToDevice); 

    int res = N/THREADS_PER_BLOCK; 
    dot<<< res, THREADS_PER_BLOCK >>> (dev_a, dev_b, dev_c); 
    //helloWorld<<< dimGrid, dimBlock >>>(d_str); 

    cudaMemcpy (c, dev_c, sizeof(int), cudaMemcpyDeviceToHost); 

    free(a); free(b); free(c); 
    cudaFree(dev_a); 
    cudaFree(dev_b); 
    cudaFree(dev_c); 
    return 0; 
} 

錯誤:

DotProductCuda.cpp:27: error: expected primary-expression before '<' token
DotProductCuda.cpp:27: error: expected primary-expression before '>' token

回答

12

<<< >>>語法調用內核不是標準C或C++。這些調用必須位於由NVCC編譯器編譯的文件中。這些文件通常以.cu擴展名命名。對CUDA的其他API調用,如cudaMalloc可以使用常規的.c或.cpp文件。

+0

回答關於<<>>的問題,但是現在我得到了'DotProductCuda.cu(26):錯誤:無法配置主機函數調用'某些想法? – Custodio 2011-05-13 16:40:48

+1

是的,你還沒有宣佈dot作爲nvcc的內核,所以它將它視爲一個隱式定義的主機函數。 – talonmies 2011-05-13 17:15:24

+0

我找到了。我沒有將__global__方法聲明爲點。 Cuda函數就像'__global__ void dot ....' – Custodio 2011-05-13 17:18:48

4

看起來編譯器無法識別出這樣的語法:< < < >>>語法。我沒有使用CUDA的經驗,但我想你需要用一個特殊的編譯器編譯這個文件,而不是一個普通的C編譯器。

3

nvcc使用文件擴展名來確定如何處理文件的內容。如果你在文件內部有CUDA語法,它必須有.cu擴展名,否則nvcc會簡單地將文件傳遞給主機編譯器,導致你正在觀察的語法錯誤。

-3

也許你在內核中使用主機函數(例如printf)?