2011-05-13 12 views
8

यह प्रोग्राम ठीक लगता है लेकिन मुझे अभी भी एक एरो, कुछ सुझाव मिल रहा है?क्यूडा संकलित करने में त्रुटि - अपेक्षित प्राथमिक अभिव्यक्ति

कार्यक्रम:

#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++ नहीं है। उन कॉलों को एनवीसीसी कंपाइलर द्वारा संकलित फाइल में होना चाहिए। उन फ़ाइलों को आम तौर पर .cu एक्सटेंशन के साथ नामित किया जाता है। CUDA को अन्य API कॉल जैसे cudaMalloc नियमित .c या .cpp फ़ाइलों में हो सकते हैं।

+0

, लेकिन अब मैं हो रही है 'DotProductCuda.cu (26): त्रुटि: एक मेजबान समारोह कॉल कुछ विचार configured' नहीं किया जा सकता? – Custodio

+1

हां, आपने कर्नेल को एनवीसीसी में डॉट घोषित नहीं किया है, इसलिए यह इसे एक निश्चित रूप से परिभाषित होस्ट फ़ंक्शन के रूप में पेश कर रहा है। – talonmies

+0

मैंने पाया। मैं __global__ विधि के रूप में डॉट घोषित नहीं कर रहा हूं। कूडा फ़ंक्शंस '__global__ शून्य डॉट ....' जैसा कुछ है – Custodio

4

ऐसा लगता है कि संकलक < < <, >>> वाक्यविन्यास को पहचान नहीं सकता है। मुझे CUDA के साथ कोई अनुभव नहीं है, लेकिन मुझे लगता है कि आपको इस फ़ाइल को एक विशेष कंपाइलर के साथ संकलित करने की आवश्यकता है, न कि सामान्य सी कंपाइलर।

3

nvcc फ़ाइल एक्सटेंशन का उपयोग कैसे करता है यह निर्धारित करने के लिए फ़ाइल एक्सटेंशन का उपयोग करता है। यदि आपके पास फ़ाइल के अंदर सीयूडीए सिंटैक्स है, तो इसमें एक .cu एक्सटेंशन होना चाहिए, अन्यथा nvcc मेजबान कंपाइलर को अनछुए फ़ाइल को पास कर देगा, जिसके परिणामस्वरूप सिंटैक्स त्रुटि दिखाई दे रही है।

-3

शायद आप कर्नेल के अंदर एक होस्ट फ़ंक्शन (उदाहरण के लिए printf) का उपयोग कर सकते हैं?

मेरे सवाल के बारे में <<>> उत्तर
संबंधित मुद्दे