2011-05-19 10 views
14

मैंने अभी सीयूडीए प्रोग्रामिंग शुरू कर दी है और यह काफी अच्छी तरह से चल रहा है, मेरे जीपीयू मान्यता प्राप्त हैं और सबकुछ। http://www.ademiller.com/blogs/tech/2010/10/visual-studio-2010-adding-intellisense-support-for-cuda-c/सीयूडीए कर्नेल कर्नेल के लिए वीएस 2010 इंटेलिजेंस सेट करना

और यहाँ:: मैं आंशिक रूप से यहां इस अत्यंत उपयोगी मार्गदर्शिका का उपयोग करके दृश्य स्टूडियो में Intellisense सेट कर लेते हैं

: http://www.ademiller.com/blogs/tech/2011/05/visual-studio-2010-and-cuda-easier-with-rc2/

हालांकि, Intellisense अभी भी इस तरह गिरी कॉल पर लेने नहीं करता है

// KernelCall.cu 
#include <iostream> 
#include "cuda.h" 
#include "cuda_runtime.h" 
#include "device_launch_parameters.h" 

__global__ void kernel(void){} 

int main() 
{ 
    kernel<<<1,1>>>(); 

    system("pause"); 
    return 0; 
} 

लाइन गिरी < < < 1,1 >>>() लाल रंग से रेखांकित किया जाता है, त्रुटि पढ़ने के साथ पहली बार एक के बाईं ओर विशेष रूप से एक तीर "त्रुटि: की उम्मीद है और अभिव्यक्ति"। हालांकि, अगर मैं फ़ंक्शन पर होवर करता हूं, तो इसके रिटर्न प्रकार और पैरामीटर ठीक से प्रदर्शित होते हैं। यह अभी भी ठीक है, मैं बस सोच रहा हूं कि इस छोटी परेशानी से कैसे छुटकारा पाएं।

उत्तर

11

विजुअल स्टूडियो सी ++ के लिए इंटेलिसेन्स प्रदान करता है, रॉकेट वैज्ञानिक के ब्लॉग की चाल मूल रूप से समानता पर निर्भर करती है CUDA-C के पास C++ है, और कुछ नहीं।

सी ++ भाषा में, कोण ब्रैकेट का उचित पार्सिंग परेशानी है। आपको < टेम्पलेट्स से कम और << शिफ्ट के रूप में मिला है, याद रखें कि बहुत पहले हमें नेस्टेड टेम्पलेट घोषणाओं के बीच एक जगह डालना पड़ा था।

तो यह पता चला है कि इस वाक्यविन्यास के साथ आने वाले एनवीआईडीआईए का व्यक्ति भाषा विशेषज्ञ नहीं था, और सबसे खराब संभव डेलीमीटर चुनने के लिए हुआ, फिर इसे तीन गुना, ठीक है, आपको परेशानी होगी। यह आश्चर्यजनक है कि इंटेलिसेंस यह देखता है जब यह देखता है।

सीयूडीए में पूर्ण इंटेलिसेन्स प्राप्त करने का एकमात्र तरीका यह है कि रनटाइम एपीआई से चालक एपीआई में स्विच करना है। सी ++ सिर्फ सी ++ है, और सीयूडीए अभी भी (प्रकार) सी ++ है, भाषा पार्सिंग के लिए चारों ओर काम करने के लिए <<<>>> खराबता नहीं है।

+1

मुझे कहना होगा, आप एनवीआईडीआईए मंचों पर किसी से भी अधिक समझदारी करते हैं ... तो मैं जो कुछ कहता हूं उसके बारे में मैं कैसे जा सकता हूं? – sj755

+1

matrixMul और matrixMulDrv के बीच अंतर को देखें। <<<> >> सिंटैक्स को कंपाइलर द्वारा अनिवार्य रूप से केवल उस कोड को थकाते हुए नियंत्रित किया जाता है जो चालक API कॉल को कॉल करता है। यदि आप CUDA-RT केवल पुस्तकालयों का उपयोग करते हैं, तो आप cuda.lib से cudart.lib से लिंक नहीं करेंगे, और "मिश्रित मोड" प्रोग्राम से निपटना पड़ सकता है। –

+1

मेरे ब्लॉग पर आपके प्रश्न का उत्तर देखें। मकड़ी सही है। यह असंभव है कि यह कभी भी सही ढंग से काम करेगा। –

20

वाह, इस धागे पर बहुत सारी धूल। मैं (अच्छी तरह से, और अधिक वैकल्पिक हल की तरह ...) यह है कि मैंने सोचा कि मैं साझा करेंगे के लिए एक मैक्रो ठीक के साथ आया था:

// nvcc does not seem to like variadic macros, so we have to define 
// one for each kernel parameter list: 
#ifdef __CUDACC__ 
#define KERNEL_ARGS2(grid, block) <<< grid, block >>> 
#define KERNEL_ARGS3(grid, block, sh_mem) <<< grid, block, sh_mem >>> 
#define KERNEL_ARGS4(grid, block, sh_mem, stream) <<< grid, block, sh_mem, stream >>> 
#else 
#define KERNEL_ARGS2(grid, block) 
#define KERNEL_ARGS3(grid, block, sh_mem) 
#define KERNEL_ARGS4(grid, block, sh_mem, stream) 
#end 

// Now launch your kernel using the appropriate macro: 
kernel KERNEL_ARGS2(dim3(nBlockCount), dim3(nThreadCount)) (param1); 

मैं इस विधि पसंद करते हैं क्योंकि किसी कारण मैं हमेशा खो के लिए '< < <' मेरे कोड में, लेकिन मैक्रो को वाक्यविन्यास रंग के माध्यम से कुछ मदद मिलती है :)।

+4

यह स्वीकार्य उत्तर – XanderMK

+0

आपके महान समाधान के लिए धन्यवाद होना चाहिए। इसके अलावा, "#end" नहीं बल्कि "#endif" सही है। छोटी छोटी चीजों के लिए खेद है। –

2

वी.एस. 2015 और CUDA 7 के बाद से आप जोड़ सकते हैं इन दोनों में शामिल किसी भी अन्य लोगों से पहले, बशर्ते आपकी फ़ाइलों .cu एक्सटेंशन:

#include "cuda_runtime.h" 
#include "device_launch_parameters.h" 

मैक्रो या कुछ भी कोई आवश्यकता नहीं। बाद में सब कुछ पूरी तरह से काम करेगा।

+1

"अपेक्षित अभिव्यक्ति" त्रुटियों से छुटकारा पाने के लिए "केवल बिल्ड करें" में अपनी त्रुटि सूची का चयन करें –

+0

नहीं, काम नहीं करता है। –

संबंधित मुद्दे