从推力::设备向量到原始指针并返回?

Posted

技术标签:

【中文标题】从推力::设备向量到原始指针并返回?【英文标题】:From thrust::device_vector to raw pointer and back? 【发布时间】:2011-12-02 12:01:22 【问题描述】:

我了解如何从向量转到原始指针,但我跳过了关于如何倒退的节拍。

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

有人可以解释/给我举个例子吗?

【问题讨论】:

【参考方案1】:

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

Thrust 为这个问题提供了一个很好的例子。

#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]);

【讨论】:

【参考方案2】:

您可以像标准容器一样初始化和填充推力向量,即通过迭代器:

#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 的版本(如果您提供数组大小)。

【讨论】:

所以仅仅从一个指针,没有长度就没有办法回到一个device_vector? dbl2* ptrDVec = 推力::raw_pointer_cast(&d_vec[0]);有没有办法从这里返回到 device_vector? “返回”是什么意思——它不是已经是设备指针了吗?你到底需要什么? 我需要能够保存对 device_vector 的指针/引用(比如我有 dVec1 和 dVec2),然后做一些事情并做一些条件,最后我想要转换指针到 dVec1 或 dVec2 作为 device_vector int dVec3 .. 这个想法是通过引用传递 dVec,并在某个时候取消引用它们并再次将它们用作 device_vectors【参考方案3】:

dbl2* ptrDVec = 推力::raw_pointer_cast(&d_vec[0]);有没有办法从这里返回到 device_vector?

没有。虽然您应该能够重用初始向量变量。

【讨论】:

以上是关于从推力::设备向量到原始指针并返回?的主要内容,如果未能解决你的问题,请参考以下文章

SWIG:返回原始指针与共享 ptrs 的向量

如何在不隐式调用“复制”的情况下初始化 CUDA 推力向量?

推力::设备向量使用推力::替换或推力::转换与自定义函子/谓词

C ++在向量迭代中删除并返回指向对象的指针

推力——按键排序两个向量

如何减少推力的元组(也返回一个元组)?