没有重载函数的实例" thrust :: remove_if"匹配参数列表

时间:2016-03-07 10:05:34

标签: cuda thrust

我用remove_if编写了程序。它使用由cudaMalloc分配的数组,并由程序的前一部分填充(在设备中)。删除后,阵列将被下一部分使用(在设备中;没有推力)。我想避免任何复制设备 - 主机,主机设备。我用这个例子: https://github.com/thrust/thrust/blob/master/examples/cuda/wrap_pointer.cu

Nvcc写道: **" remove_if.cu(19):错误:没有重载函数的实例" thrust :: remove_if"匹配参数列表             参数类型是:(thrust :: device_ptr,thrust :: device_ptr,is_zero)"。 **

我编写了一个简单的程序示例,但错误相同:

#include <stdio.h>
#include "book.h"
#include <thrust/remove.h>
#include <thrust/device_ptr.h>
#include <thrust/device_vector.h>
int main(void)
{
  int *dev_lsubpix;
  struct is_zero
  {
    __host__ __device__
    bool operator()(int x)
    {
      return (x<1);
    }
  };
HANDLE_ERROR( cudaMalloc((void**)&dev_lsubpix, 10*sizeof(int)));
thrust::device_ptr<int> dev_ptr = thrust::device_pointer_cast(dev_lsubpix);
  int new_length=     thrust::remove_if(dev_ptr, dev_ptr+10, is_zero())-dev_ptr;
  cudaFree(dev_lsubpix);
}

1 个答案:

答案 0 :(得分:2)

虽然从错误中找出原因并不是很明显,但问题在于您尝试使用的谓词仿函数的范围。因为您已在main范围内声明了仿函数,所以它不是main之外的有效类型,并且编译器不知道如何处理匿名类型。

如果您像这样重构代码:

#include <stdio.h>
#include <thrust/remove.h>
#include <thrust/device_ptr.h>
#include <thrust/device_vector.h>
struct is_zero
{
    __host__ __device__
        bool operator()(int x)
        {
            return (x<1);
        }
};

int main(void)
{
    int *dev_lsubpix;
    cudaMalloc((void**)&dev_lsubpix, 10*sizeof(int));
    thrust::device_ptr<int> dev_ptr = thrust::device_pointer_cast(dev_lsubpix);
    int new_length = thrust::remove_if(dev_ptr, dev_ptr+10, is_zero())-dev_ptr;
    cudaFree(dev_lsubpix);
}

因此函子定义在全局范围内,我认为你会发现代码编译正确。