thrust :: minmax_element参数列表不匹配

时间:2014-10-05 06:17:42

标签: cuda thrust

我有一小段代码使用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());

1 个答案:

答案 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的使用是一个错误,如果您尝试运行它,代码将抛出错误。