thrust::device_vector of thrust::complex 的编译错误,可能是由于错误的实现
Compile error with thrust::device_vector of thrust::complex, possibly due to a wrong implementation
我实际上正在学习 CUDA 和 thrust,我正在尝试用 .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++ 将无法编译代码。
我实际上正在学习 CUDA 和 thrust,我正在尝试用 .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++ 将无法编译代码。