2013-06-19 4 views
11

मैं सीयूडीए के साथ काम कर रहा हूं और मैंने जटिल पूर्णांक संख्याओं से निपटने के लिए int2_ कक्षा बनाई है।सीयूडीए बाहरी वर्ग लिंकेज और पीटीएक्सएएस फ़ाइल में अनसुलझा बाहरी समारोह

ComplexTypes.h फ़ाइल में

कक्षा घोषणाओं इस प्रकार है:

ComplexTypes.cpp फ़ाइल में
namespace LibraryNameSpace 
{ 
    class int2_ { 

     public: 
      int x; 
      int y; 

      // Constructors 
      __host__ __device__ int2_(const int,const int); 
      __host__ __device__ int2_(); 
      // etc. 

      // Equalities with other types  
      __host__ __device__ const int2_& operator=(const int); 
      __host__ __device__ const int2_& operator=(const float); 
      // etc. 

    }; 
} 

क्लास कार्यान्वयन इस प्रकार है:

#include "ComplexTypes.h" 

__host__ __device__   LibraryNameSpace::int2_::int2_(const int x_,const int y_)   { x=x_; y=y_;} 
__host__ __device__   LibraryNameSpace::int2_::int2_() {} 
// etc. 

__host__ __device__ const LibraryNameSpace::int2_& LibraryNameSpace::int2_::operator=(const int a)      { x = a;   y = 0.;    return *this; } 
__host__ __device__ const LibraryNameSpace::int2_& LibraryNameSpace::int2_::operator=(const float a)      { x = (int)a;  y = 0.;    return *this; } 
// etc. 

सब कुछ अच्छी तरह काम करता है। main में (जिसमें ComplexTypes.h शामिल है) मैं int2_ संख्याओं से निपट सकता हूं।

CudaMatrix.cu फ़ाइल में, मैं अब ComplexTypes.h शामिल कर रहा हूँ और परिभाषित करने और ठीक से __global__ समारोह instantiating:

template <class T1, class T2> 
__global__ void evaluation_matrix(T1* data_, T2* ob, int NumElements) 
{ 
    const int i = blockDim.x * blockIdx.x + threadIdx.x; 
    if(i < NumElements) data_[i] = ob[i]; 
} 

template __global__ void evaluation_matrix(LibraryNameSpace::int2_*,int*,int); 

CudaMatrix.cu फ़ाइल की स्थिति main कार्य करने के लिए सममित हो रहा है। फिर भी, संकलक शिकायत:

Error 19 error : Unresolved extern function '_ZN16LibraryNameSpace5int2_aSEi' C:\Users\Documents\Project\Test\Testing_Files\ptxas simpleTest 

कृपया, कि विचार करें:

  1. अलग फ़ाइलों के लिए कार्यान्वयन जाने से पहले, सब कुछ सही ढंग से काम किया गया था जब दोनों घोषणाओं और main फ़ाइल में कार्यान्वयन भी शामिल है।
  2. समस्याग्रस्त निर्देश data_[i] = ob[i] है।

किसी को भी पता चल रहा है कि क्या हो रहा है?

+0

शायद आप एक 'ComplexTypes.cpp' फ़ाइल नहीं है, बल्कि एक' ComplexTypes.cu' फ़ाइल जो आप NVCC करने से गुजर रहे हैं, नहीं तो '__host__ __device__' संकलन नहीं करना चाहिए ... – talonmies

+0

मुझे अपने मुद्दे का समाधान मिला है। मैंने इसे एक उत्तर के रूप में पोस्ट किया है कि यह अन्य उपयोगकर्ताओं के लिए उपयोगी हो सकता है। – JackOLantern

उत्तर

24

प्रक्रिया मैं अपनी पोस्ट में पालन किया है उपरोक्त दो मुद्दे हैं:

  1. ComplexTypes.cpp फ़ाइल नाम ComplexTypes.cu की ओर मुड़ जाना चाहिए ताकि nvcc CUDA कीवर्ड __device__ और __host__ अवरोधन सकता है। इसकी टिप्पणी में टैलोनीज़ ने इसकी ओर इशारा किया है। असल में, पोस्ट करने से पहले, मैं पहले से ही फ़ाइल नाम बदलकर .cpp से .cu पर बदल रहा था, लेकिन संकलक शिकायत कर रहा था और एक ही त्रुटि दिखा रहा था। इसलिए, मैं आसानी से वापस कदम था;

  2. विजुअल स्टूडियो 2010 में, किसी को देखें -> संपत्ति पृष्ठ; कॉन्फ़िगरेशन गुण -> CUDA सी/सी ++ -> सामान्य -> ​​रिलायटेबल डिवाइस कोड जेनरेट करें -> हां (-rdc = true)। यह अलग संकलन के लिए आवश्यक है। दरअसल, NVIDIA CUDA Compiler Driver NVCC में, यह कहा जाता है कि गया है:

CUDA मेजबान वस्तुओं में डिवाइस कोड एम्बेड करके काम करता है। पूरे कार्यक्रम संकलन में, यह होस्ट ऑब्जेक्ट में निष्पादन योग्य डिवाइस कोड एम्बेड करता है। अलग संकलन में, हम होस्ट ऑब्जेक्ट में स्थानांतरित डिवाइस कोड को एम्बेड करते हैं, और सभी डिवाइस कोड को एक साथ जोड़ने के लिए डिवाइस लिंकर (nvlink) चलाते हैं। Nvlink के आउटपुट को मेजबान लिंकर द्वारा अंतिम होस्ट करने योग्य बनाने के लिए सभी होस्ट ऑब्जेक्ट्स के साथ एक साथ जोड़ा जाता है।पीढ़ी बनाम निष्पादन योग्य डिवाइस कोड --relocatable-device-code = {true, false} विकल्प द्वारा नियंत्रित किया जाता है, जिसे -rdc = {true, false} तक छोटा किया जा सकता है।

+4

असल में, आपके पास केवल दो विकल्प हैं - सभी डिवाइस कोड को उसी संकलन इकाई में ले जाएं, या अलग संकलन का उपयोग करें। आप उत्तर बाद वाले हैं, और यह केवल CUDA 5.0 या नए के साथ काम करता है। लिंकर पेश होने से पहले सीयूडीए अनुप्रयोगों को तैयार करने का एकमात्र तरीका था। – talonmies

+0

आपको धन्यवाद। मैं घंटों तक इस समस्या का पीछा कर रहा हूं। (सीयूडीए 5.5 और वीएस2012 पर भी लागू होता है) –

+4

नाइट एक्लिप्स में, विकल्प परियोजना> गुण> बिल्ड> सेटिंग्स> CUDA – M2X

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