下面我发布了一些我正在使用的代码,以便了解CUDA推力库。在任何人说任何事情之前,我知道这是找到素数的一种非常低效的方法,我只想要一些东西来测试并行性。不幸的是,当我运行这个时,我得到一个错误就是弹出的内容:
Unhandled exception at at 0x76FCC41F in Thrust_2.exe: Microsoft C++ exception: thrust::system::system_error at memory location 0x0022F500.
如果我在doTest函数中将device_vector
切换为host_vector
,我将不再收到错误,程序运行正常。为什么会发生这种情况?如何在不崩溃的情况下使用device_vector?我想尽可能多地并行做。
此外,整个程序与host_vector一起工作。
PS:
我正在使用VS2012
Cuda:V5.5
GPU:geforce gt 540M
推力:得到了cuda。
提前致谢!
struct prime{
__host__ __device__
void operator()(long& x){
bool result = true;
long stop = ceil(sqrt((float)x));
if(x%2!=0){
for(int i = 3;i<stop;i+=2){
if(x%i==0){
result = false;
break;
};
}
}else{
result = false;
}
if(!result)
x = -1;
}
};
void doTest(long gen){
using namespace thrust;
device_vector<long> tNum(gen);
sequence(tNum.begin(),tNum.end()); // fails here when using a device_vector
}
int main(){
doTest(1000);
return 0;
}
答案 0 :(得分:1)
这是一个问题:
void operator()(long& x){
bool result = true;
long stop = ceil(sqrt(x));
事实上,您应该收到编译器发出的关于它的警告消息。
设备代码中的sqrt
功能仅适用于float
和double
个参数。您的参数类型为long
。这意味着编译器将尝试使用sqrt
函数的主机库版本,该函数在设备代码中不起作用。当您将矢量创建为主矢量时,这不是问题,因为函数正在主机代码中运行。但是,当您切换到设备矢量时,仿函数(在设备上运行)将在该点崩溃,并产生推力误差。
作为一个简单的测试,您可以将其修改为:
long stop = ceil(sqrt((float)x));
看看它是否消除了崩溃。从long
到float
的演员是否对您的代码有效是您必须要做的事情。
答案 1 :(得分:1)
问题是我有错误的编译器参数,我觉得现在真的很蠢......
我正在编译1.0,我把它切换到2.0,现在它正在工作。