Как продвинуть итератор в функции тяги

Я изучаю тягу. Но я не понял, как получить значение итератора.

Пример кода выглядит так:

#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

Я не могу заставить это скомпилировать. Как я могу решить эту проблему?

1 ответ

@Gang.Wang: Я думаю, что вы просто перепутали две разные вещи: все STL-подобные функции, включая for_each, итераторы device_vector и т. Д., Это просто "фасад", который существует только на хосте.

Оператор while () содержит фактический код графического процессора, который скомпилирован в ядро ​​CUDA и применен к каждому элементу вашего вектора параллельно. Следовательно, device_vector::iterators не доступны из вашего функтора.

Другие вопросы по тегам