我有一小段代码使用thrust :: minmax_element来找出3个浮点数的结构的最小值和最大值。但编译器总是说参数列表不匹配。我在Mac OS 10.9下使用CUDA 6.5
struct Float3 {float x, y, z;};
struct Comparator : public binary_function<Float3, Float3, bool> {
__host__ __device__ bool operator()(const Float3& a, const Float3& b) const
{
return a.x > b.x;
}
};
Float3 a[10];
thrust::minmax_element(device_ptr<Float3>(a),
device_ptr<Float3>(a) + 10,
Comparator());
答案 0 :(得分:2)
将来,请提供一个完整的示例,有人可以复制,粘贴和编译以查看问题,而无需添加任何内容或更改任何内容。
Float3 a[10];
在主机上创建数据。您无法使用thrust::device_ptr
包装创建的指针。它必须用于指代设备上的数据。 a
不在设备上。以下代码在CUDA 6.5中为我编译(并运行):
#include <thrust/extrema.h>
#include <thrust/device_ptr.h>
struct Float3 {float x, y, z;};
struct Comparator : public thrust::binary_function<Float3, Float3, bool> {
__host__ __device__ bool operator()(const Float3& a, const Float3& b) const
{
return a.x > b.x;
}
};
int main(){
Float3 a[10];
Float3 *d_a;
cudaMalloc(&d_a, 10*sizeof(Float3));
cudaMemcpy(d_a, a, 10*sizeof(Float3), cudaMemcpyHostToDevice);
thrust::minmax_element(thrust::device_ptr<Float3>(d_a),
thrust::device_ptr<Float3>(d_a) + 10,
Comparator());
}
请注意,即使您使用a
代替d_a
,上述代码实际上也会编译,因为它们都是原始指针,推力无法区分在编译时)。但a
的使用是一个错误,如果您尝试运行它,代码将抛出错误。