访问使用pinned_allocator分配的host_vector项(推力库)

时间:2013-09-24 23:32:01

标签: c++ cuda thrust

我有以下矢量:

thrust::host_vector< T , thrust::cuda::experimental::pinned_allocator< T > > h_vector

其中T,在我目前的情况下,是float类型。我想从推力的角度以正确的方式访问第i个元素。

天真的做法是:

float el = h_vector[i];

导致以下错误:

../src/gpu.cuh(134): error: a reference of type "float &" (not const-qualified) cannot be initialized with a value of type "thrust::host_vector<float, thrust::system::cuda::experimental::pinned_allocator<float>>"

显然,h_array [i]类型是reference,所以我继续尝试使用thrust::raw_refence_castthrust::pointer来检索我的浮动数据无济于事。

最后,我提出了:

    float *raw = thrust::raw_pointer_cast(h_array->data());
    float el = raw[i];

有没有更好的方法来实现这一目标?

编辑:原型代码

#include <thrust/host_vector.h>
#include <thrust/system/cuda/experimental/pinned_allocator.h>

static const int DATA_SIZE = 1024;

int main()
{

    thrust::host_vector<float, thrust::cuda::experimental::pinned_allocator<float> > *hh = new thrust::host_vector<float, thrust::cuda::experimental::pinned_allocator<float> >(DATA_SIZE);
    float member, *fptr;
    int i;

//  member = hh[1]; //fails

    fptr = thrust::raw_pointer_cast(hh->data()); //works
    member = fptr[1];
    return 0;
}

编辑2 : 我实际上使用了这个向量:

thrust::host_vector< T , thrust::cuda::experimental::pinned_allocator< T > > *h_vector

使我的原始问题完全误导。

1 个答案:

答案 0 :(得分:2)

我不知道为什么在代码中需要这种级别的复杂功能。你看过我发布的here的例子了吗?

无论如何,这行代码:

   thrust::host_vector<float, thrust::cuda::experimental::pinned_allocator<float> > *hh = new thrust::host_vector<float, thrust::cuda::experimental::pinned_allocator<float> >(DATA_SIZE);

创建一个指向vector 的指针。这与矢量不同。

使用这样的结构:

member = hh[1];

hh指向向量的指针时,它不是尝试访问向量中元素的有效方法。这将是一种索引到一个向量数组的有效方法,这不是你想要做的。

另一方面,如果你这样做:

member = (*hh)[1];

我相信你的编译错误会消失。它适合我。

请注意,我认为这不是CUDA或推力问题。我在使用std::vector尝试您的方法时遇到了类似的问题。另请注意,在原始问题中没有任何地方表明h_vector是指向向量的指针,而您所显示的代码行并未按此方式创建。因此,您的编辑/原型代码与原始描述明显不同。