CUDA

2013-07-23 13 views
6

में बहुरूपता का उपयोग कैसे करें मैं कुछ भौतिकी सिमुलेशन कोड को C++ से CUDA तक पोर्ट कर रहा हूं।CUDA

मौलिक एल्गोरिदम को इस प्रकार समझा जा सकता है: एक वेक्टर के प्रत्येक तत्व को ऑपरेटर लागू करना।

apply(Operator o, Vector v){ 
    ... 
} 

उदाहरण के लिए::

apply(add_three_operator, some_vector) 

वेक्टर में प्रत्येक तत्व के लिए तीन जोड़ना होगा स्यूडोकोड में, एक सिम्युलेशन में निम्न कर्नेल कॉल शामिल हो सकता है।

मेरे सी ++ कोड में, मेरे पास कई अलग ठोस कार्यान्वयन के साथ एक सार बेस क्लास ऑपरेटर है। महत्वपूर्ण विधि कक्षा ऑपरेटर { वर्चुअल डबल ऑपरेट (डबल x) = 0 है; ऑपरेटर लिखें (ऑपरेटर लो, ऑपरेटर ro); ... }

AddOperator के लिए कार्यान्वयन इस प्रकार दिखाई देंगे:

class AddOperator : public Operator{ 
    private: 
     double to_add; 
    public: 
     AddOperator(double to_add): to_add(to_add){} 
     double operator(double x){ 
      return x + to_add; 
     } 
}; 

ऑपरेटर वर्ग स्केलिंग और ऑपरेटर के ठोस कार्यान्वयन रचना के लिए तरीके हैं। यह अमूर्तता मुझे "पत्ती" ऑपरेटरों को अधिक सामान्य परिवर्तनों में बस लिखने की अनुमति देती है।

उदाहरण के लिए:

apply(compose(add_three_operator, square_operator), some_vector); 

तीन तो वेक्टर के प्रत्येक तत्व वर्ग जोड़ना होगा।

समस्या यह है कि CUDA कर्नेल में वर्चुअल विधि कॉल का समर्थन नहीं करता है। मेरा वर्तमान विचार टेम्पलेट्स का उपयोग करना है। फिर कर्नेल कॉल कुछ इस तरह दिखेगा:

apply<Composition<AddOperator,SquareOperator>> 
    (compose(add_three_operator, square_operator), some_vector); 

कोई सुझाव?

+6

मेरा मानना ​​है कि 'virtual' कार्यों के साथ' -arch = sm_20' या उच्चतर संकलन की आवश्यकता है। हालांकि, मैं कर्नेल लॉन्च करने वाले मेजबान कोड में आपके बहुरूपता को अलग करने की अनुशंसा करता हूं। यहां तक ​​कि यदि आपको अंततः संकलन की चीजें मिलती हैं तो भी मुझे उम्मीद है कि सिम कोड में वर्चुअल फ़ंक्शन प्रेषण के प्रदर्शन निराशाजनक होंगे। –

+5

मैं जेरेड से सहमत हूं। यहां तक ​​कि सीपीयू पर, यदि बड़े वैक्टर के प्रत्येक तत्व पर एक ही ऑपरेशन लागू किया जा रहा है, तो मैं रिफैक्टरिंग पर विचार करूंगा ताकि बहुरूपता उच्च स्तर पर हो, और वर्चुअल विधि कॉल आपके आंतरिक लूप में नहीं हैं। एक बार ऐसा करने के बाद, समांतरता अधिक प्रदर्शनकारी होगी (सीयूडीए, ओपनएमपी, या जो भी हो)। आप इसके लिए जोर भी विचार कर सकते हैं। – harrism

+0

प्रतिक्रिया के लिए धन्यवाद। मैं वास्तव में पहले से ही जोर का उपयोग कर रहा हूँ। मैं टेम्पलेट्स के साथ आगे जा रहा हूँ। – user2611717

उत्तर

1

कुछ इस तरह ... शायद

template <class Op1, class Op2> 
class Composition {...} 

template <class Op1, class Op2> 
Composition<Op1, Op2> compose(Op1& op1, Op2& op2) {...} 

template<class C> 
void apply(C& c, VecType& vec){...}