如何将make_transform_iterator()与counting_iterator<>一起使用和Thrust中的execution_policy?

时间:2014-01-22 10:26:08

标签: cuda gpgpu nvidia thrust

我尝试使用MSVS2012,CUDA5.5,Thrust 1.7编译此代码:

#include <iostream>
#include <thrust/iterator/counting_iterator.h>
#include <thrust/iterator/transform_iterator.h>
#include <thrust/find.h>

#include <thrust/execution_policy.h>

struct is_odd {
  __host__ __device__ bool operator()(uint64_t &x) {
    return x & 1;
  }
};

int main() {
    thrust::counting_iterator<uint64_t> first(0);
    thrust::counting_iterator<uint64_t> last = first + 100;

    auto iter = thrust::find(thrust::device,
                thrust::make_transform_iterator(first, is_odd()),
                thrust::make_transform_iterator(last, is_odd()),
                true);

    int bbb; std::cin >> bbb;
    return 0;
}

并收到错误:

  

错误1错误:不允许不完整类型C:\ Program Files \ NVIDIA   GPU Computing Toolkit \ CUDA \ v5.5 \ include \ thrust \ detail \ type_traits.h   413 1 HostDevice

如果我使用host / device_vector而不是counting_iterator那么一切都好。怎么了?

1 个答案:

答案 0 :(得分:4)

我稍微改变了你的算子定义:

struct is_odd {
  __host__ __device__ bool operator()(uint64_t &x) {

到此:

struct is_odd : public thrust::unary_function<uint64_t, bool> {
  __host__ __device__ bool operator()(const uint64_t &x) {

它为我编译。