2012-12-31 15 views
6

मैं एक क्यूडा प्रोग्राम लिख रहा हूं और प्रिंटफ फ़ंक्शन का उपयोग कर कुडा कर्नेल के अंदर कुछ प्रिंट करने की कोशिश कर रहा हूं। लेकिन जब मैं कार्यक्रम तो संकलन कर रहा हूँ मैं एक त्रुटिकूडा कर्नेल से प्रिंटिंग

error : calling a host function("printf") from a __device__/__global__ function("agent_movement_top") is not allowed 


error MSB3721: The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\bin\nvcc.exe" -gencode=arch=compute_10,code=\"sm_10,compute_10\" --use-local-env --cl-version 2008 -ccbin "c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin" -I"C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.2\C\common\inc" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include" -G --keep-dir "Debug" -maxrregcount=0 --machine 32 --compile -g -Xcompiler "/EHsc /nologo /Od /Zi /MDd " -o "Debug\test.cu.obj" "C:\Users\umdutta\Desktop\SANKHA_ALL_MATERIALS\PROGRAMMING_FOLDER\ABM_MODELLING_2D_3D\TRY_NUM_2\test_proj_test\test_proj\test_proj\test.cu"" exited with code 2. 

मैं कार्ड GTX 560 ti उपयोग कर रहा हूँ एक गणना क्षमता 2.0 से अधिक होने और हो रही है जब मैं CUDA कर्नेल मैं भी से मुद्रण के बारे में थोड़ा खोज की है मैंने देखा कि कार्ड का पूरा लाभ लेने के लिए मुझे कंपाइलर को sm_10 से sm_2.0 में बदलने की जरूरत है। इसके अलावा कुछ ने उद्देश्य प्रदान करने के लिए cuPrintf के लिए सुझाव दिया। मैं थोड़ा उलझन में हूं कि मुझे क्या करना चाहिए और मेरे कंसोल स्क्रीन पर प्रिंटआउट प्राप्त करने का सबसे सरल और तेज़ तरीका क्या होना चाहिए। अगर मुझे एनवीसीसी कंपाइलर को 1.0 से 2.0 में बदलना है तो मुझे क्या करना चाहिए? एक और बात मैं उल्लेख करना चाहूंगा कि मैं विंडोज़ 7.0 का उपयोग कर रहा हूं और विजुअल स्टूडियो 2010 में प्रोग्रामिंग कर रहा हूं। आपकी सभी मदद के लिए धन्यवाद।

+0

अगर (1) आप sm_21 लक्ष्य वास्तुकला के लिए संकलन यह काम करना चाहिए और (2) सुनिश्चित करें कि 'stdio.h शामिल करें'। CUDA रनटाइम में कर्नेल के लिए printf के डिवाइस ओवरलोडिंग शामिल हैं, लेकिन सी तंत्रर्ड I/O लाइब्रेरी को इस तंत्र के लिए काम करने के लिए स्पष्ट रूप से शामिल किया जाना चाहिए। – talonmies

+0

HI! मानक i/o हेडर फ़ाइल हमेशा शामिल थी और मेरे कार्ड की गणना क्षमता 2.1 है। तो मुझे लगता है कि इसे एनवीसीसी कंपाइलर की sm_21 सुविधाओं के साथ संकलित किया जाना चाहिए। हालांकि मैंने cuPrintf फ़ंक्शन का उपयोग कर अपने मुद्दों को हल किया। लेकिन मैं अभी भी जानना चाहता हूं कि मैं अपनी डिफ़ॉल्ट एनवीसीसी 1.0 गणना क्षमता को 2.1 गणना क्षमता में कैसे बदल सकता हूं। – duttasankha

+0

@RogerDahl: यह सही है और यह पूरी तरह से अच्छी तरह से काम करता है। क्या आप सिर्फ उत्तर के रूप में पोस्ट कर सकते हैं ताकि मैं इसे भी स्वीकार कर सकूं। आपने मेरा दिन बना दिया। अनेक अनेक धन्यवाद। – duttasankha

उत्तर

8

गणना क्षमता> = 2.0 के उपकरणों पर सादे printf() के उपयोग को सक्षम करने के लिए, कम से कम सीसी 2.0 के सीसी के लिए संकलन करना और डिफ़ॉल्ट को अक्षम करना महत्वपूर्ण है, जिसमें सीसी 1.0 के लिए एक बिल्ड शामिल है।

अपनी परियोजना में .cu फ़ाइल पर राइट-क्लिक करें, Properties का चयन करें, Configuration Properties चुनें। CUDA C/C++ | DeviceCode Generation लाइन पर क्लिक करें, त्रिकोण पर क्लिक करें, Edit का चयन करें। कोड जनरेशन संवाद बॉक्स में, Inherit from parent or project defaults अनचेक करें, शीर्ष विंडो में compute_20,sm_20 टाइप करें, ठीक क्लिक करें।

+0

काम नहीं कर रहा है। अभी भी printf के बारे में अनिश्चित के रूप में शिकायत। मेरा सीयूडीए 6.5 + वीएस2012 + टेस्ला 2050 है – Ono

6

इस समस्या को हल करने का एक तरीका cuPrintf फ़ंक्शन का उपयोग करके है जो कर्नेल से प्रिंट करने में सक्षम है। फ़ोल्डर

C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.2\C\src\simplePrintf 
परियोजना फ़ोल्डर में

से कॉपी फ़ाइलों cuPrintf.cu और cuPrintf.cuh। तो फिर अपने प्रोजेक्ट में हेडर फाइल cuPrintf.cuh जोड़ सकते हैं और अपने कोड में

#include "cuPrintf.cu" 

जोड़ें। फिर अपने कोड एक प्रारूप नीचे उल्लेख में लिखा जाना चाहिए:

#include “cuPrintf.cu” 
__global__ void testKernel(int val) 
{ 
    cuPrintf(“Value is: %d\n”, val); 
} 

int main() 
{ 
    cudaPrintfInit(); 
    testKernel<<< 2, 3 >>>(10); 
    cudaPrintfDisplay(stdout, true); 
    cudaPrintfEnd(); 
    return 0; 
} 

ऊपर प्रक्रिया का पालन करके एक डिवाइस समारोह से कंसोल विंडो पर एक प्रिंट मिल सकता है। हालांकि मैंने उपर्युक्त तरीके से अपने मुद्दों को हल किया है, फिर भी मेरे पास डिवाइस फ़ंक्शन से printf का उपयोग करने का समाधान नहीं है। printf फीचर को सक्षम करने के लिए यह मेरे एनवीसीसी कंपाइलर को sm_10 से sm_21 में अपग्रेड करने के लिए सही और बिल्कुल जरूरी है, तो अगर कोई मुझे प्रकाश दिखा सकता है तो यह बहुत उपयोगी होगा। आपके सभी सहयोग के लिए धन्यवाद

3

आप जो कुछ भी CUDA कर्नेल अंदर से चाहते हैं मुद्रित करने के लिए इस कोड को लिख सकते हैं:

# if __CUDA_ARCH__>=200 
    printf("%d \n", tid); 

#endif 

और < शामिल stdio.h>

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