平均点的 CUDA 函子

CUDA functor of min point

我惊呆了。我阅读了很多答案,但仍然无法正常工作。我试图在 struct point 上实现比较器,这将有助于找到数组中的最小点,这是目前的代码:

struct minPointOperator
{
    __device__ __host__ point operator()(const point& x, const point& y) const 
    { 
        return x.value > y.value ? y : x;
    } 
};
int findBestPointIndx(point* dev_points, int pointCount)
{
    thrust::device_ptr<point> points(dev_points);
    int id = thrust::reduce(points, points+pointCount, 0, minPointOperator());
    return id;
}

但是它没有编译,它只是喷出很多 function "minPointOperator::operator()" cannot be called with the given argument list 错误

如果您研究 reduce 的推力文档可能会有所帮助。

注意以下几点:

Template Parameters

InputIterator is a model of Input Iterator and InputIterator's value_type is convertible to T.

T is a model of Assignable, and is convertible to BinaryFunction's first_argument_type and second_argument_type.

这意味着您选择 init 参数以及 reduce 的 return 类型 不是任意的。它们必须(有效地)与输入迭代器的类型相同(即本例中的 point)。

thrust::reduce(在这种情况下)不是 return 最小元素的索引。它return是最小元素的实际内容,即如果你的元素是point,它return是一个point,并且初始值必须是[=13]类型=].

要找到最小点的索引(似乎是你的objective)有多种可能性。一种可能性是将数据与索引数组(例如 counting_iterator)一起压缩(使用 zip_iterator),基于此进行最小缩减,然后从值 return编辑者 thrust::reduce.

但是,我认为更好的方法是建议 here, i.e. use thrust::min_element will return 一个最小元素的interator,然后可以是用于轻松计算索引。

这是一个有效的例子:

$ cat t683.cu
#include <thrust/device_ptr.h>
#include <thrust/extrema.h>
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>

#include <iostream>

struct point{

  int value;
  int data;
};


struct minPointOperator
{
    __device__ __host__ bool operator()(const point& x, const point& y) const
    {
        return (x.value < y.value);
    }
};

int findBestPointIndx(point* dev_points, int pointCount)
{
    thrust::device_ptr<point> points(dev_points);
    int id = thrust::min_element(points, points+pointCount, minPointOperator()) - points;
    return id;
}

int main(){

  point data[4] = { {4,5}, {0,7}, {2,3}, {6,1} };
  thrust::host_vector<point> h_data(data, data + 4);
  thrust::device_vector<point> d_data = h_data;
  int min_point = findBestPointIndx(thrust::raw_pointer_cast(d_data.data()), 4);
  std::cout << "min index: " << min_point << std::endl;
  return 0;
}

$ nvcc t683.cu -o t683
$ ./t683
min index: 1
$