我正在尝试使用推力将一个值插入host_vector中的第三个位置。
static thrust::host_vector <int *> bins;
int * p;
bins.insert(3, 1, p);
但是我遇到了错误:
error: no instance of overloaded function "thrust::host_vector<T, Alloc>::insert [with T=int *, Alloc=std::allocator<int *>]" matches the argument list
argument types are: (int, int, int *)
object type is: thrust::host_vector<int *, std::allocator<int *>>
以前有人见过这个,我该怎么解决这个问题?我想使用矢量将信息传递到GPU。我最初试图使用矢量矢量来表示包含不同数量数据的空间单元格,但是学到了不可能用推力。所以相反,我使用了一个矢量bins
来保存我的数据,按空间单元格排序(前3个值可能对应第一个单元格,下一个2对应第二个单元格,下一个0到第三个单元格等)。保留的值是指向粒子的指针,并表示空间单元格中的粒子数量(在运行时之前未知)。
答案 0 :(得分:2)
如评论中所述,thrust::host_vector
直接在std::vector
建模,您尝试使用的操作需要迭代器作为位置参数,这就是您获得的原因编译错误。如果您查阅相关文档,可以看到这一点:
http://en.cppreference.com/w/cpp/container/vector/insert https://thrust.github.io/doc/classthrust_1_1host__vector.html#a9bb7c8e26ee8c10c5721b584081ae065
您展示的代码段的完整工作示例如下所示:
#include <iostream>
#include <thrust/host_vector.h>
int main()
{
thrust::host_vector <int *> bins(10, reinterpret_cast<int *>(0));
int * p = reinterpret_cast<int *>(0xdeadbeef);
bins.insert(bins.begin()+3, 1, p);
auto it = bins.begin();
for(int i=0; it != bins.end(); ++it, i++) {
int* v = *it;
std::cout << i << " " << v << std::endl;
}
return 0;
}
请注意,这需要在nvcc中启用C ++ 11语言功能(因此请使用CUDA 8.0):
~/SO$ nvcc -std=c++11 -arch=sm_52 thrust_insert.cu
~/SO$ ./a.out
0 0
1 0
2 0
3 0xdeadbeef
4 0
5 0
6 0
7 0
8 0
9 0
10 0