2011-10-06 25 views
13

Tôi hiểu làm thế nào để đi từ một vector đến một con trỏ thô nhưng im bỏ qua một nhịp về cách đi ngược.Từ lực đẩy :: device_vector đến con trỏ thô và ngược lại?

// 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 

Ai đó có thể giải thích/chỉ cho tôi ví dụ?

Trả lời

9

Bạn khởi tạo và cư vectơ lực đẩy giống như container tiêu chuẩn, ví dụ thông qua vòng lặp:

#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 
} 

Trong ví dụ đơn giản của bạn không cần phải đi theo đường vòng qua con trỏ, như bạn có thể chỉ cần sao chép các container khác trực tiếp. Nói chung, nếu bạn có một con trỏ đến đầu của một mảng, bạn có thể sử dụng phiên bản cho v3 nếu bạn cung cấp kích thước mảng.

+0

vì vậy chỉ cần từ một con trỏ, mà không có chiều dài không có cách nào để có được trở lại một device_vector? – madmaze

+3

dbl2 * ptrDVec = lực đẩy :: raw_pointer_cast (& d_vec [0]); có cách nào để quay lại thiết bị thu thập dữ liệu không? – madmaze

+0

Ý của bạn là "quay lại" - có phải đó là con trỏ thiết bị không? Chính xác thì bạn cần gì? –

3

dbl2 * ptrDVec = lực đẩy :: raw_pointer_cast (& d_vec [0]); là có một cách để lấy lại một device_vector từ này?

Không có. Mặc dù bạn có thể sử dụng lại biến vector ban đầu.

18

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

Thrust cung cấp một ví dụ điển hình cho câu hỏi này.

#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; 
} 

Và nhận được con trỏ thô từ container lực đẩy được như trả lời đã một mình ..

dbl2* ptrDVec = thrust::raw_pointer_cast(&d_vec[0]); 
Các vấn đề liên quan