使用推力插入host_vector

时间:2017-03-06 17:54:13

标签: insert cuda thrust

我正在尝试使用推力将一个值插入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到第三个单元格等)。保留的值是指向粒子的指针,并表示空间单元格中的粒子数量(在运行时之前未知)。

1 个答案:

答案 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