推力 copy_if:不完整的类型是不允许的

Posted

技术标签:

【中文标题】推力 copy_if:不完整的类型是不允许的【英文标题】:thrust copy_if: incomplete type is not allowed 【发布时间】:2017-03-29 10:50:39 【问题描述】:

我正在尝试使用 thrust::copy_if 来压缩一个带有谓词检查正数的数组:

头文件:file.h:

struct is_positive

  __host__ __device__
  bool operator()(const int x)
  
    return (x >= 0);
  
;

和文件.cu

#include "../headers/file.h"
#include <thrust/device_ptr.h>
#include <thrust/device_vector.h>
#include <thrust/copy.h>


void compact(int* d_inputArray, int* d_outputArray, const int size)

  thrust::device_ptr<int> t_inputArray(d_inputArray);
  thrust::device_ptr<int> t_outputArray(d_outputArray);
  thrust::copy_if(t_inputArray, t_inputArray + size, d_outputArray, is_positive());

我收到以下开头的错误消息:

/usr/local/cuda/include/thrust/system/detail/generic/memory.inl(40): 错误:不允许不完整的类型

full errormsg here

如果我只使用 copy 而不是 copy_if,代码编译得很好,所以我统治了一切,除了谓词 is_positive() out.

提前感谢您提供有关如何调试此类推力错误的任何帮助或一般提示。

e:我使用的是 Cuda 7.5

【问题讨论】:

【参考方案1】:

在我看来,你只是有一个错字。这个:

thrust::copy_if(t_inputArray, t_inputArray + size, d_outputArray, is_positive());
                                                   ^

应该是这样的:

thrust::copy_if(t_inputArray, t_inputArray + size, t_outputArray, is_positive());

您将原始指针与正确的推力设备指针混合在一起,这会造成麻烦。

【讨论】:

这很尴尬。谢谢你,你是对的,就像一个魅力!

以上是关于推力 copy_if:不完整的类型是不允许的的主要内容,如果未能解决你的问题,请参考以下文章

C语言 不允许使用不完整的类型

C语言 不允许使用不完整的类型

我可以实例化一个 std::reference_wrapper<T> ,其中 T 是不完整的类型吗?

c语言报错不允许使用不完整类型,让用户自定义数组大小。

c++mfc为何报错不允许指针指向不完整的类类型?

下面声明的类型不能是不完整类型的语句是啥意思