2011-10-06 11 views
13

मैं समझता हूं कि एक वेक्टर से कच्चे सूचक में कैसे जाना है, लेकिन पीछे की ओर जाने के तरीके पर एक हरा छोड़ना।जोर से :: device_vector कच्चे सूचक और वापस?

// our host vector 
thrust::host_vector<dbl2> hVec; 

// pretend we put data in it here 

// get a device_vector 
thrust::device_vector<dbl2> dVec = hVec; 

// get the device ptr 
thrust::device_ptr devPtr = &d_vec[0]; 

// now how do i get back to device_vector? 
thrust::device_vector<dbl2> dVec2 = devPtr; // gives error 
thrust::device_vector<dbl2> dVec2(devPtr); // gives error 

क्या कोई मुझे उदाहरण के लिए समझा सकता/बता सकता है?

उत्तर

9

आप प्रारंभ और बस मानक कंटेनर, अर्थात के माध्यम से iterators की तरह जोर वैक्टर पॉप्युलेट:

#include <thrust/device_vector.h> 
#include <thrust/device_ptr.h> 

int main() 
{ 
    thrust::device_vector<double> v1(10);     // create a vector of size 10 
    thrust::device_ptr<double> dp = v1.data();    // or &v1[0] 

    thrust::device_vector<double> v2(v1);     // from copy 
    thrust::device_vector<double> v3(dp, dp + 10);   // from iterator range 
    thrust::device_vector<double> v4(v1.begin(), v1.end()); // from iterator range 
} 

अपने सरल उदाहरण में, संकेत के माध्यम से चक्कर जाना के रूप में आप बस सीधे अन्य कंटेनर कॉपी कर सकते हैं की आवश्यकता नहीं है। आम तौर पर, यदि आपके पास किसी सरणी की शुरुआत में पॉइंटर है, तो आप सरणी आकार की आपूर्ति करते समय v3 के लिए संस्करण का उपयोग कर सकते हैं।

+0

तो बस एक सूचक से, लंबाई बिना वापस एक device_vector को पाने के लिए कोई रास्ता नहीं है? – madmaze

+3

dbl2 * ptrDVec = जोर :: raw_pointer_cast (& d_vec [0]); इस से डिवाइस_वेक्टर पर वापस जाने का कोई तरीका है? – madmaze

+0

आपका क्या मतलब है "वापस आएं" - क्या यह पहले से ही एक डिवाइस सूचक नहीं है? आपको वास्तव में क्या चाहिए? –

3

dbl2 * ptrDVec = जोर :: raw_pointer_cast (& d_vec [0]); क्या इस से डिवाइस_वेक्टर पर वापस जाने का कोई तरीका है?

ऐसा नहीं है। हालांकि आप प्रारंभिक वेक्टर चर का पुन: उपयोग करने में सक्षम होना चाहिए।

18

http://code.google.com/p/thrust/source/browse/examples/cuda/wrap_pointer.cu

थ्रस्ट इस प्रश्न के लिए एक अच्छा उदाहरण प्रदान करता है।

#include <thrust/device_ptr.h> 
#include <thrust/fill.h> 
#include <cuda.h> 

int main(void) 
{ 
    size_t N = 10; 

    // obtain raw pointer to device memory 
    int * raw_ptr; 
    cudaMalloc((void **) &raw_ptr, N * sizeof(int)); 

    // wrap raw pointer with a device_ptr 
    thrust::device_ptr<int> dev_ptr = thrust::device_pointer_cast(raw_ptr); 

    // use device_ptr in Thrust algorithms 
    thrust::fill(dev_ptr, dev_ptr + N, (int) 0);  

    // access device memory transparently through device_ptr 
    dev_ptr[0] = 1; 

    // free memory 
    cudaFree(raw_ptr); 

    return 0; 
} 

और जोर कंटेनर से कच्चे सूचक हो रही खुद के द्वारा पहले से ही उत्तर है के रूप में ..

dbl2* ptrDVec = thrust::raw_pointer_cast(&d_vec[0]); 
संबंधित मुद्दे