推力变换定义自定义二元函数

时间:2014-02-13 10:28:03

标签: cuda transform gpu functor thrust

我正在尝试编写一个自定义函数来执行求和。我按照这个问题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

请有人向我解释为什么我收到此错误?以及如何解决它。如果我无法清楚地解释问题,请发表评论。三江源。

1 个答案:

答案 0 :(得分:2)

您希望将两个输入向量传递给thrust::transform,然后进行就地变换(即未指定输出向量)。

thrust::transform

没有这种化身

您已通过:

thrust::transform(vector_first, vector_last, vector_first, operator);

最接近的匹配原型是一个变换版本,它接受一个输入向量并创建一个输出向量。在这种情况下,您需要传递一个将输入向量类型(hashElem作为参数的一元操作,并返回适合输出向量的类型,即{ {1}}在这种情况下,即你写的(不是你的意图)。你的int没有这样做,并且不能用推力期望传递给它的参数来调用它。

在我看来,你有两个选择:

  1. 您可以切换到带有两个输入向量并生成一个输出向量的version of transform,并创建一个二元op作为仿函数。

  2. 您可以将两个输入向量压缩在一起,如果您想要的话,可以执行in-place transform。那么你的仿函数将是一个一元的操作,但是它可以作为参数,无论是通过解引用输入向量创建的元组,它都必须返回或修改相同类型的元组。

  3. 顺便说一句,你直接从主机数组创建设备指针的方法看起来很糟糕。您可能希望查看推力quick start guide