我在CUDA中有以下类函数
class forSecondMax{
private:
int toExclude;
public:
__device__ void setToExclude(int val){
toExclude = val;
}
__device__ bool operator ()
(const DereferencedIteratorTuple& lhs, const DereferencedIteratorTuple& rhs)
{
using thrust::get;
//if you do <=, returns last occurence of largest element. < returns first
if (get<0>(lhs)== get<2>(lhs) /*&& get<0>(rhs) == get<2>(rhs)*/ && get<0>(lhs) != toExclude/* && get<0>(rhs)!= toExclude */) return get<1>(lhs) < get<1>(rhs); else
return true ;
}
};
有没有办法从主机设置toExclude的值?
答案 0 :(得分:1)
解决这个问题所需要做的就是为仿函数定义一个构造函数,该构造函数从参数中设置数据成员。所以你的课程看起来像这样:
class forSecondMax{
private:
int toExclude;
public:
__device__ __host__ forSecondMax(int x) : toExclude(x) {};
__device__ __host__ bool operator ()
(const DereferencedIteratorTuple& lhs,
const DereferencedIteratorTuple& rhs)
{
using thrust::get;
if (get<0>(lhs)== get<2>(lhs) && get<0>(lhs) != toExclude)
return get<1>(lhs) < get<1>(rhs);
else
return true ;
}
};
[免责声明:用浏览器编写,从未测试或编译,使用风险自负]
要在将仿函数传递给推力算法之前设置值,请创建仿函数并将其传递给推力调用,例如:
forSecondMax op(10);
thrust::remove_if(A.begin(), A.end(), op);
将在类的新实例中将数据成员toExclude
设置为值10,并在流压缩调用中使用该实例。