使用Cuda Thrust device_vector崩溃

时间:2013-12-04 17:34:34

标签: c++ cuda runtime-error gpu thrust

下面我发布了一些我正在使用的代码,以便了解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;
}

2 个答案:

答案 0 :(得分:1)

这是一个问题:

void operator()(long& x){
bool result = true;
long stop = ceil(sqrt(x));

事实上,您应该收到编译器发出的关于它的警告消息。

设备代码中的sqrt功能仅适用于floatdouble个参数。您的参数类型为long。这意味着编译器将尝试使用sqrt函数的主机库版本,该函数在设备代码中不起作用。当您将矢量创建为主矢量时,这不是问题,因为函数正在主机代码中运行。但是,当您切换到设备矢量时,仿函数(在设备上运行)将在该点崩溃,并产生推力误差。

作为一个简单的测试,您可以将其修改为:

long stop = ceil(sqrt((float)x));

看看它是否消除了崩溃。从longfloat的演员是否对您的代码有效是您必须要做的事情。

答案 1 :(得分:1)

问题是我有错误的编译器参数,我觉得现在真的很蠢......

我正在编译1.0,我把它切换到2.0,现在它正在工作。