平均点的 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
$
我惊呆了。我阅读了很多答案,但仍然无法正常工作。我试图在 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
$