1

我有以下向量:

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

使我原来的问题完全具有误导性。

4

1 回答 1

2

我不知道为什么您的代码需要这种级别的复杂性。你看过我在这里发布的例子

无论如何,这行代码:

   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是指向向量的指针,并且您显示的代码行并没有以这种方式创建它。因此,您的编辑/原型代码与您的原始描述明显不同。

于 2013-09-25T06:36:45.523 回答