2012-02-21 14 views
7

हाल ही में मैं बहुत जोर दे रहा हूं। मैंने देखा है कि जोर देने के लिए, किसी को हमेशा सीपीयू मेमोरी से जीपीयू मेमोरी में डेटा कॉपी करना होगा।
के निम्न उदाहरण देखते हैं:क्या सीपीयू मेमोरी से जीपीयू तक प्रतिलिपि बनाने का एक बेहतर और तेज़ तरीका है?

int foo(int *foo) 
{ 
    host_vector<int> m(foo, foo+ 100000); 
    device_vector<int> s = m; 
} 

मैं काफी यकीन है कि कैसे host_vector निर्माता काम करता है नहीं कर रहा हूँ, लेकिन यह है कि मैं प्रारंभिक डेटा की प्रतिलिपि रहा हूँ, *foo से आ रही, दो बार लगता है - host_vector जब एक बार इसे प्रारंभ किया गया है, और एक और समय जब device_vector प्रारंभ किया गया है। मध्यवर्ती डेटा प्रतियों के बिना सीपीयू से जीपीयू में कॉपी करने का कोई बेहतर तरीका है? मुझे पता है कि मैं एक रैपर के रूप में device_ptr का उपयोग कर सकता हूं, लेकिन यह अभी भी मेरी समस्या को ठीक नहीं करता है।
धन्यवाद!

उत्तर

14

device_vector के रचनाकारों में से एक दो पुनरावर्तकों द्वारा निर्दिष्ट तत्वों की एक श्रृंखला लेता है। यह बहुत चालाक अपने उदाहरण में कच्चे सूचक को समझने के लिए है, तो आप एक device_vector सीधे निर्माण और अस्थायी host_vector बच सकते हैं:

void my_function_taking_host_ptr(int *raw_ptr, size_t n) 
{ 
    // device_vector assumes raw_ptrs point to system memory 
    thrust::device_vector<int> vec(raw_ptr, raw_ptr + n); 

    ... 
} 

अपने कच्चे सूचक CUDA स्मृति को अंक हैं, तो एक device_ptr परिचय:

void my_function_taking_cuda_ptr(int *raw_ptr, size_t n) 
{ 
    // wrap raw_ptr before passing to device_vector 
    thrust::device_ptr<int> d_ptr(raw_ptr); 

    thrust::device_vector<int> vec(d_ptr, d_ptr + n); 

    ... 
} 

device_ptr का उपयोग किसी भी संग्रहण को आवंटित नहीं करता है; यह टाइप सिस्टम में पॉइंटर के स्थान को एन्कोड करता है।

+0

तर्क आकार_टी एन वेक्टर में तत्वों की संख्या निर्दिष्ट करता है, और size_t प्रकार के नाम में नहीं होना चाहिए, size_t आमतौर पर बाइट्स में डेटा लंबाई निर्दिष्ट करता है। – TripleS

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