include了thrust的文件必须用CUDA环境进行编译,例如文件后缀为.cu或通过“-x”指令指定任意后缀的文件通过CUDA环境编译。下面举一个我遇到的例子 //---------a.h---------//
#include <thrust/device_vector.h>
class A
{
public:
void foo();
protected:
thrust::device_vector<float> _temp;
}
//---------a.cu---------//
#include "a.h"
#include <stdio.h>
void A:foo()
{
auto t = vector<float>(10, 0);
_temp = t;
}
//---------b.cpp---------//
#include "a.h"
....
通过a.h的桥梁,b.cpp中悄悄地include了thrust,而我没使用“-x”指令,故产生错误(如下图,提示thrust库内部文件报错:/usr/local/cuda/include/thrust/detail/internal_functional.h;/usr/local/cuda/include/thrust/system/cuda/detail/par.h;/usr/local/cuda/include/thrust/system/cuda/detail/util.h等)。
因此,千万别在头文件中include thrust!!!类的成员变量可以考虑改为静态全局变量,注意变量的初始化和实例数不能超过1。
//---------a.h---------//
class A
{
public:
void foo();
}
//---------a.cu---------//
#include "a.h"
#include <stdio.h>
#include <thrust/device_vector.h> // include放在cpp文件
static thrust::device_vector<float> _temp; // 改为静态全局变量
void A:foo()
{
auto t = vector<float>(10, 0);
_temp = t;
}
//---------b.cpp---------//
#include "a.h"
....
即使损失一些成员变量具有的特性,但是这样能够保证安全。有更好方法的朋友欢迎评论区交流~?