Cuda 推力::minmax_元素参数列表不匹配

Cuda 推力::minmax_元素参数列表不匹配,cuda,thrust,Cuda,Thrust,我有以下一小段代码,它使用推力::minmax_元素来找出由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 Floa

我有以下一小段代码,它使用推力::minmax_元素来找出由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());

在将来,请提供一个完整的示例,有人可以复制、粘贴和编译以查看问题,而无需添加任何内容或更改任何内容

Float3 a[10];
在主机上创建数据。您不能使用推力::设备ptr包装这样创建的指针。它必须用于引用设备上的数据。设备上不存在。以下代码为我在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是一个错误,如果您尝试运行它,代码将抛出一个错误。

谢谢您的回答。我知道问题出在哪里了。我最初在函数中定义了struct Comparator。在我把它移出函数之后,错误被修复了。