0

我正在研究推力。但我不明白如何获取迭代器指向的值。

示例代码如下:

#include <thrust/for_each.h>
#include <thrust/device_vector.h>
#include <iostream>
#include <vector>
using namespace std;

class ADD
{
private:
    typedef typename thrust::device_vector<int>::iterator PTR;
public:
    ADD(){}
    ~ADD(){}
    void setPtr(PTR &ptr)
    {this->ptr=ptr;}
    __host__ __device__
    void operator()(int &x)
    {
            // note that using printf in a __device__ function requires
            // code compiled for a GPU with compute capability 2.0 or
            // higher (nvcc --arch=sm_20)
            x+=add();
    }
    __host__ __device__
    int add()
    {return *ptr++;}
private:
    PTR ptr;
};
int main()
{
    thrust::device_vector<int> d_vec(3);
    d_vec[0] = 0; d_vec[1] = 1; d_vec[2] = 2;
    thrust::device_vector<int>::iterator itr=d_vec.begin();
    ADD *addtest=new ADD();
    addtest->setPtr(itr);
    thrust::for_each(d_vec.begin(), d_vec.end(), *addtest);
    for(int i=0;i<3;i++)
            cout<<d_vec[i]<<endl;
    return 0;
}

当我使用 nvcc -arch=sm_20 test.cu 编译它时,我收到以下警告:

test.cu(28): warning: calling a host function("thrust::experimental::iterator_facade<thrust::detail::normal_iterator<thrust::device_ptr<int> > , thrust::device_ptr<int> , int, thrust::detail::cuda_device_space_tag, thrust::random_access_traversal_tag, thrust::device_reference<int> , long> ::operator *") from a __device__/__global__ function("printf_functor::add") is not allowed

test.cu(28): warning: calling a host function("thrust::experimental::iterator_facade<thrust::detail::normal_iterator<thrust::device_ptr<int> > , thrust::device_ptr<int> , int, thrust::detail::cuda_device_space_tag, thrust::random_access_traversal_tag, thrust::device_reference<int> , long> ::operator *") from a __device__/__global__ function("printf_functor::add") is not allowed

我无法编译它。我怎么解决这个问题?

4

1 回答 1

1

@Gang.Wang:我认为您只是混淆了 2 个不同的东西:所有类似 STL 的功能,包括 for_each、device_vector 迭代器等,都只是一个仅存在于主机上的“外观”。

而 operator() 包含编译到 CUDA 内核并并行应用于向量的每个元素的实际 GPU 代码。因此,您的仿函数无法访问 device_vector::iterators。

于 2012-08-02T08:42:34.280 回答