c++ - 使用 Cuda Thrust device_vector 崩溃

标签 c++ cuda runtime-error gpu thrust

<分区>

下面我发布了一些我用来尝试感受 CUDA 推力库的代码。在有人说什么之前,我知道这是一种非常低效的查找素数的方法,我只是想要一些东西来测试并行性。不幸的是,当我运行它时,我得到一个错误,这里弹出: Thrust_2.exe 中 0x76FCC41F 处的未处理异常:Microsoft C++ 异常:内存位置 0x0022F500 处的 thrust::system::system_error。

如果我在 doTest 函数中将 device_vector 切换为 host_vector,我将不再收到错误并且程序可以完美运行。为什么会发生这种情况,我怎样才能让它在不崩溃的情况下使用 device_vector?我想尽可能并行地做。 整个程序也按预期使用 host_vector。

附言:

我正在使用 VS2012

库达:V5.5

显卡: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;
}

最佳答案

这是一个问题:

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

事实上,您应该收到来自编译器的警告消息。

设备代码中可用的 sqrt 函数仅适用于 floatdouble 参数。您的参数是 long 类型。这意味着编译器将尝试使用 sqrt 函数的主机库版本,这在设备代码中不起作用。当您将 vector 创建为宿主 vector 时,这不是问题,因为仿函数在宿主代码中运行。但是,当您切换到设备 vector 时,仿函数(在设备上运行)会在此时崩溃,并抛出推力错误。

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

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

看看它是否消除了崩溃。从 longfloat 的转换是否对您的代码有效是您必须决定的事情。

关于c++ - 使用 Cuda Thrust device_vector 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20382061/

相关文章:

c++ - 线程中的 QTcpSocket 并不总是立即发送数据

C++: bitset 不能正常工作

cuda - 在 CUDA 中写入全局内存

java - 是否可以在 JAVA 中编写正确且可移植的控制台输出 "hello world"?

c++ - 在一个函数调用中创建一个线程池并从另一个函数调用中使用它

c++ - std::vector 增加峰值内存

c# - 时间测量 CUDA 和 C#

cuda - 如何找到 CUDA 的 epsilon、min 和 max 常量?

javascript - React JS 错误行报告不准确

python - '权限错误: [Errno 13] Permission denied' after running a python script using a batch file