Friday, April 12, 2013

CUDA Thrust: Summary: host_vector, device_vector, device_ptr, raw pointer conversions

 

http://stackoverflow.com/questions/7678995/from-thrustdevice-vector-to-raw-pointer-and-back 

   1:  // our host vector 
   2:   
   3:  thrust::host_vector<dbl2> hVec; 
   4:   
   5:   
   6:   
   7:   
   8:  // pretend we put data in it here 
   9:   
  10:  ….
  11:   
  12:   
  13:   
  14:  // get a device_vector 
  15:   
  16:  thrust::device_vector<dbl2> dVec = hVec; 
  17:   
  18:   
  19:   
  20:  // get the device ptr 
  21:   
  22:  thrust::device_ptr devPtr = &d_vec[0];
  23:   
  24:   
  25:   
  26:  // if you want to pass it to the kernel, need to convert to a raw pointer
  27:   
  28:  dbl2* ptrDVec = thrust::raw_pointer_cast(&d_vec[0]); 
  29:   
  30:    
  31:   
  32:  // To get back from the raw pointer to device_ptr so that host code can access it  
  33:   
  34:  thrust::device_ptr<int> dev_ptr = thrust::device_pointer_cast(raw_ptr); 
  35:   
  36:  // Now we can, for example: 
  37:   
  38:  // use device_ptr in Thrust algorithms 
  39:   
  40:  thrust::fill(dev_ptr, dev_ptr + N, (int) 0); 
  41:   
  42:  // access device memory transparently through device_ptr 
  43:   
  44:  dev_ptr[0] = 1;
  45:   
  46:    
  47:   
  48:  // On a side note, if you have a device_vector, you can get its device_ptr 
  49:   
  50:  thrust::device_vector<double> v1(10); // create a vector of size 10 
  51:   
  52:  thrust::device_ptr<double> dp = v1.data(); // or &v1[0] 
  53:   
  54:    
  55:   
  56:  // Now: From thrust::device_ptr<T> we can construct thrust:device_vector<T> 
  57:   
  58:  thrust::device_vector<double> v2(v1); // from copy 
  59:   
  60:  thrust::device_vector<double> v3(dp, dp + 10); // from iterator range 
  61:   
  62:  thrust::device_vector<double> v4(v1.begin(), v1.end()); // from iterator range 

No comments:

Post a Comment