2013-05-05 6 views
8
  1. ऐसा लगता है जब एक नया थ्रस्ट वेक्टर बनाने सभी तत्वों को डिफ़ॉल्ट द्वारा 0 कर रहे हैं - मैं सिर्फ पुष्टि करने के लिए कि हमेशा ऐसा हो जाएगा चाहते हैं।कैसे जोर :: device_vector में तत्वों की डिफ़ॉल्ट निर्माण से बचने के लिए?

  2. यदि हां, तो वहाँ भी बाईपास निर्माता के लिए एक रास्ता है अतिरिक्त गति के लिए इस व्यवहार के लिए जिम्मेदार है (क्योंकि कुछ वैक्टर के लिए मैं एक प्रारंभिक मूल्य, जैसे के लिए उन्हें जरूरत नहीं है अगर उनकी कच्चे संकेत किया जा रहा है उत्पादन के रूप में CUBLAS को पारित)?

उत्तर

7

thrust::device_vector तत्वों यह सिर्फ std::vector की तरह इसकी आपूर्ति संभाजक का उपयोग कर, शामिल निर्माण करती है। जब वेक्टर एक तत्व बनाने के लिए कहता है तो आवंटक क्या करता है इसे नियंत्रित करना संभव है।

वेक्टर तत्व के डिफ़ॉल्ट-प्रारंभ से बचने के लिए एक कस्टम संभाजक का उपयोग करें:

// uninitialized_allocator is an allocator which 
// derives from device_allocator and which has a 
// no-op construct member function 
template<typename T> 
    struct uninitialized_allocator 
    : thrust::device_malloc_allocator<T> 
{ 
    // note that construct is annotated as 
    // a __host__ __device__ function 
    __host__ __device__ 
    void construct(T *p) 
    { 
    // no-op 
    } 
}; 

// to make a device_vector which does not initialize its elements, 
// use uninitialized_allocator as the 2nd template parameter 
typedef thrust::device_vector<float, uninitialized_allocator<float> > uninitialized_vector; 

आप अभी भी एक कर्नेल लांच की लागत का कारण बन जाएगा uninitialized_allocator::construct आह्वान करने के लिए, लेकिन वह गिरी नो-सेशन जो संन्यास ले लेंगे हो जाएगा जल्दी जल्दी। आप वास्तव में रुचि रखते हैं कि सरणी भरने के लिए आवश्यक मेमोरी बैंडविड्थ से परहेज करना है, जो यह समाधान करता है।

वहाँ एक पूरा उदाहरण कोड here है।

ध्यान दें कि इस तकनीक का 1.7 या बेहतर थ्रस्ट की आवश्यकता है।

+0

बहुत अच्छा। पहले एसएलएल के लिए लिखित डीबग आवंटन ओवरलोड होने के बावजूद, मैं अंतिम निर्माण कॉल भूल गया था। खुदाई रखना चाहिए था। +1 :) – leander

+0

असल में - मैं उलझन में हूं। मैं 'insert' करने के लिए अपने उदाहरण जंजीरों में है कि' resize' में गलत हूँ, जो 'fill_insert', जो' फिर uninitialized_fill_n' में समाप्त होता है के लिए बारी जंजीरों में? तो क्या आपको अभी भी नए 'स्टोरेज_ टाइप' क्षेत्र की स्थापना करते समय 'निर्माण' को अनदेखा करने के बावजूद प्रतियां मिल रही हैं? ... जाहिर है, मुझे डीबगर में इसके माध्यम से कदम उठाने की ज़रूरत है, लेकिन मैं नहीं देख रहा हूं कि डिफ़ॉल्ट/मूल्य प्रारंभिक 'x' डिफ़ॉल्ट तर्क से अंतिम' uninitialized_fill_n' कैसे टाला जा सकता है। – leander

+0

आप सबसे हाल ही में जोर के साथ एक डिबगर में से निकलने के लिए आवश्यकता हो सकती है। यह एक जटिल प्रेषण है। –

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