thrust::device_vector of thrust::complex 的编译错误,可能是由于错误的实现

Compile error with thrust::device_vector of thrust::complex, possibly due to a wrong implementation

我实际上正在学习 CUDAthrust,我正在尝试用 .cpp 做一个项目, .hpp 个文件和 .cu.cuh 个文件。因此,我做了第一个小实现(见下面的代码),但是我有一个编译错误。这是我编译错误的output

老实说,我不知道这种错误到底是什么意思,但我发现这是来自这一行:

thrust::device_vector<thrust::complex<T>> deviceVec_;

因为当我注释掉这一行时,就没有编译错误了。因此,我假设这是由于 thrust::device_vector 的实施内容以及我将 .cuh 文件包含在 .hpp 文件中的事实,因为我的 main.cpp 是handled by g++ 预处理将由 g++ 而不是 nvcc.

执行

我的 main.cpp 文件的内容:

#include "QGPU.hpp"
int main()
{
     QGPU::GPU<double>  gpu;
     return (0);
}

我的 .hpp 文件的内容:

#pragma once

# include "QCUDA.cuh"

namespace QGPU {

 template<typename T>
 class GPU {
 private:
  QCUDA::CUDAGPU<T> cgpu_;
 public:
  GPU();
  virtual ~GPU();

};

template<typename T>
GPU<T>::GPU()
{};

template<typename T>
GPU<T>::~GPU()
{};

};

我的 .cuh 文件的内容:

#pragma once

# include <thrust/host_vector.h>
# include <thrust/device_vector.h>
# include <thrust/complex.h>

namespace QCUDA {

 template<typename T>
 class CUDAGPU {
 private:
  thrust::host_vector<thrust::complex<T>> hostVec_;
  thrust::device_vector<thrust::complex<T>> deviceVec_;
 public:
  CUDAGPU();
  virtual ~CUDAGPU();
 };

 template<typename T>
 CUDAGPU<T>::CUDAGPU()
 {};

 template<typename T>
 CUDAGPU<T>::~CUDAGPU()
 {};

};

因此,我的问题是:

有没有办法解决这个编译错误,从而维护这个实现?

或者我必须改变我的想法,我应该如何实施一个 .cpp.hpp 文件和 .cu.cuh 文件混合在一起的项目?

如果我必须更改我的实现,有可能通过关注我的注意力来获得一个类似的示例,说明什么是好的实现?

注意: 我实际上使用的是 cuda 版本的 GTX 1060:

$nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Wed_Apr_11_23:16:29_CDT_2018
Cuda compilation tools, release 9.2, V9.2.88

您需要将 main.cpp 重命名为 main.cu 才能正常工作。否则,您将 CUDA 代码导入普通 .cpp 文件,主机 C++ 将无法编译代码。