我正在尝试编写一个自定义函数来执行求和。我按照这个问题Cuda Thrust Custom function来参考。这就是我如何定义我的仿函数
struct hashElem
{
int freq;
int error;
};
//basically this function adds some value to to the error field of each element
struct hashErrorAdd{
const int error;
hashErrorAdd(int _error): error(_error){}
__host__ __device__
struct hashElem operator()(const hashElem& o1,const int& o2)
{
struct hashElem o3;
o3.freq = o1.freq;
o3.error = o1.error + (NUM_OF_HASH_TABLE-o2)*error; //NUM_OF_HASH_TABLE is a constant
return o3;
}
};
struct hashElem freqError[SIZE_OF_HASH_TABLE*NUM_OF_HASH_TABLE];
int count[SIZE_OF_HASH_TABLE*NUM_OF_HASH_TABLE];
thrust::device_ptr<struct hashElem> d_freqError(freqError);
thrust::device_ptr<int> d_count(count);
thrust::transform(thrust::device,d_freqError,d_freqError+new_length,d_count,hashErrorAdd(perThreadLoad)); //new_length is a constant
编译时的这段代码会出现以下错误:
错误:无法使用给定的参数列表
调用函数“hashErrorAdd :: operator()”参数类型是:(hashElem)
对象类型是:hashErrorAdd
请有人向我解释为什么我收到此错误?以及如何解决它。如果我无法清楚地解释问题,请发表评论。三江源。
答案 0 :(得分:2)
您希望将两个输入向量传递给thrust::transform
,然后进行就地变换(即未指定输出向量)。
您已通过:
thrust::transform(vector_first, vector_last, vector_first, operator);
最接近的匹配原型是一个变换版本,它接受一个输入向量并创建一个输出向量。在这种情况下,您需要传递一个将输入向量类型(hashElem
)仅作为参数的一元操作,并返回适合输出向量的类型,即{ {1}}在这种情况下,即你写的(不是你的意图)。你的int
没有这样做,并且不能用推力期望传递给它的参数来调用它。
在我看来,你有两个选择:
您可以切换到带有两个输入向量并生成一个输出向量的version of transform,并创建一个二元op作为仿函数。
您可以将两个输入向量压缩在一起,如果您想要的话,可以执行in-place transform。那么你的仿函数将是一个一元的操作,但是它可以作为参数,无论是通过解引用输入向量创建的元组,它都必须返回或修改相同类型的元组。
顺便说一句,你直接从主机数组创建设备指针的方法看起来很糟糕。您可能希望查看推力quick start guide。