【问题标题】:thrust copy_if with const source用 const 源推 copy_if
【发布时间】:2013-07-22 10:56:17
【问题描述】:

我的问题出在以下代码中:

过滤器函数编译,并在源不恒定时按其应有的方式运行(迭代器相应调整)。但是,当我将源代码更改为 const 时,编译器会为 copy_if 语句的前两个变量给出以下错误: “对象具有与成员函数不兼容的类型限定符”。

我相信某处存在 const to not const 转换错误,但坦率地说,我不知道在哪里。任何帮助,将不胜感激。

#include "thrust\device_vector.h"
#include "thrust\copy.h"

typedef thrust::device_vector<float>::const_iterator    Dc_FloatIterator;
typedef thrust::device_vector<float>::iterator          D_FloatIterator;

typedef thrust::device_vector<int>::const_iterator  Dc_IntIterator;
typedef thrust::device_vector<int>::iterator        D_IntIterator;

typedef thrust::tuple< Dc_IntIterator, Dc_IntIterator, Dc_FloatIterator> Dc_ListIteratorTuple;
typedef thrust::zip_iterator<Dc_ListIteratorTuple>   Dc_ListIterator;//type of the class const iterator

typedef thrust::tuple< D_IntIterator, D_IntIterator, D_FloatIterator > D_ListIteratorTuple;
typedef thrust::zip_iterator<D_ListIteratorTuple>    D_ListIterator;//type of the class iterator

struct selector{//selector functor for the copy if call
const int val;

selector(int _val) : val(_val) {}

__host__ __device__
bool operator()(const int& x ) {
return ( x == val );
   }
};

class Foo{    
public:
    thrust::device_vector<int>      ivec1;
    thrust::device_vector<int>      ivec2;
    thrust::device_vector<float>    fvec1;

    Foo(){;}
    ~Foo(){;}

    D_ListIterator begin(){//cast of begin iterator
        return D_ListIterator(D_ListIteratorTuple( ivec1.begin(), ivec2.begin(), fvec1.begin() ));
    }
    D_ListIterator end(){//cast of end iterator
        return D_ListIterator(D_ListIteratorTuple( ivec1.end(), ivec2.end(), fvec1.end() ));
    }

    Dc_ListIterator cbegin(){//cast of const begin iterator
        return Dc_ListIterator(Dc_ListIteratorTuple( ivec1.cbegin(), ivec2.cbegin(), fvec1.cbegin() ));
    }
    Dc_ListIterator cend(){//cast of const end iterator
        return Dc_ListIterator(Dc_ListIteratorTuple( ivec1.cend(), ivec2.cend(), fvec1.cend() ));
    }

    void const_filter( const Foo& TheOther, const int& target ){//doesnt work
        //This function should copy those member of the vectors where
        //the ivec2[i] == target is true
        thrust::copy_if(
            TheOther.cbegin(),
            TheOther.cend(),
            TheOther.ivec2.cbegin(),
            this->begin(),
            selector(target) );
    }
    void filter( Foo& TheOther, const int& target ){//works
        //This function should copy those member of the vectors where
        //the ivec2[i] == target is true
        thrust::copy_if(
            TheOther.begin(),
            TheOther.end(),
            TheOther.ivec2.cbegin(),
            this->begin(),
            selector(target) );
    }
    void insert(const int& one, const int& two,const float& three ){
        ivec1.push_back(one);
        ivec2.push_back(two);
        fvec1.push_back(three);
    }

    int size(){
        return ivec1.size();
    }
};

bool CheckIfSublistIsConnected(const Foo& list,const int& sublist_num){
Foo tmp;

tmp.const_filter( list, sublist_num );

return (bool)tmp.size();//for symplicity, othervise here is a function that check if
                        //the edge list represents a connected graph
}
int main(void){
Foo list;
bool connected;
list.insert(10,2,1.0);
list.insert(11,2,1.0);
list.insert(12,2,1.0);
list.insert(10,3,1.0);
list.insert(10,3,1.0);

connected=CheckIfSublistIsConnected(list,2); 

if( connected ) return 0;
else return -1;
}

我发现用以下编译器替换 TheOther.cbegin() / .cend() 可以接受它。这意味着我在 typedef 部分的某个地方搞砸了,但是在哪里?

    thrust::make_zip_iterator(
        thrust::make_tuple(
            TheOther.ivec1.cbegin(),
            TheOther.ivec2.cbegin(),
            TheOther.fvec1.cbegin() ))

【问题讨论】:

  • 您能否提供一个完整的示例,显示在传递/编译情况下对Foo::filter 的调用以及对Foo::filter 的调用以及导致编译失败的参数?
  • 它并不完整。我不知道cbegin()cend() 是什么样子的。您能否创建一个简单的、可编译的示例来演示该问题,但其中没有任何不必要的代码来演示该问题?我想要一些我可以复制、粘贴和编译而无需编辑或添加任何东西的东西。
  • 我编辑了一个显示问题的代码,您可以尝试编译它。在构建这个示例时,我注意到如果 filter(...) 调用只需要一个 Foo& (不是 const )并且我调用 cend 和 cbegin 它就可以工作。然而,在我的真实程序中,这个调用进行了大约 5 次调用,第一个函数也将 Foo 作为 const 引用,所以我必须将它作为 const 引用传递。
  • 我还将const 添加到cendcbegin 定义中,(编译)问题就消失了。这是否意味着你已经解决了你的问题?如果是这样,您能否将其发布为答案,我会支持它。 (看来这不是推力问题?)谢谢。
  • 完成,感谢您的帮助。在这个项目中,我 90% 的 bug 都与推力有关,所以我假设这个也是。

标签: cuda constants gpu thrust const-iterator


【解决方案1】:

当它出现时,我已经在 cend/cbegin 的定义中添加了 const 魔术字。

Dc_ListIterator cbegin() const {
        return Dc_ListIterator(Dc_ListIteratorTuple( ivec1.cbegin(), ivec2.cbegin(), fvec1.cbegin() ));
    }
Dc_ListIterator cend() const {
        return Dc_ListIterator(Dc_ListIteratorTuple( ivec1.cend(), ivec2.cend(), fvec1.cend() ));
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-04
    • 2017-03-29
    • 1970-01-01
    • 2014-06-26
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多