我有以下矢量:
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_cast
和thrust::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
使我的原始问题完全误导。
答案 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
是指向向量的指针,而您所显示的代码行并未按此方式创建。因此,您的编辑/原型代码与原始描述明显不同。