首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CUDA Convex Hull程序在大输入时崩溃

CUDA Convex Hull程序在大输入时崩溃
EN

Stack Overflow用户
提问于 2011-08-18 11:52:08
回答 1查看 1.1K关注 0票数 2

我正在尝试在CUDA中并行实现quickHull算法(对于凸包)。对于input_size <= 100万,它可以正常工作。当我尝试1000万点的时候,程序崩溃了。我的显卡大小是1982MB,算法中的所有数据结构对于这个输入大小总共需要不超过600MB,这还不到可用空间的50%。

通过注释掉我的内核行,我发现当我试图访问数组元素时发生崩溃,并且我试图访问的元素的索引没有越界(双重检查)。下面是它崩溃的内核代码。

代码语言:javascript
复制
for(unsigned int i = old_setIndex; i < old_setIndex + old_setS[tid]; i++) 
{

    int pI = old_set[i];
    if(pI <= -1 || pI > pts.size())
    {               
        printf("Thread %d: i = %d, pI = %d\n", tid, i, pI);
        continue;
    }
    p = pts[pI];

    double d = distance(A,B,p);

    if(d > dist) {
        dist = d;
        furthestPoint = i;
        fpi = pI;
    }
}
//fpi = old_set[furthestPoint]; 
//printf("Thread %d: Furthestpoint = %d\n", tid, furthestPoint);

当我取消对for循环后面的语句(数组访问和printf)的注释时,我的代码崩溃。我无法解释这个错误,因为furthestPoint总是在old_set数组大小的范围内。Old_setS存储每个线程可以操作的较小数组的大小。即使只是尝试打印furthestPoint (最后一行)的值,上面没有数组访问语句,它也会崩溃。

上面的代码输入大小为1百万的<=是没有问题的。在1000万的情况下,我是否溢出了设备中的一些缓冲区?

请帮我找出坠机的原因。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-18 16:05:17

您的代码中没有越界内存访问(或者至少没有引起您所看到的症状的内存访问)。

正在发生的事情是,你的内核正在被显示器驱动程序杀死,因为它在显示器GPU上执行的时间太长了。所有CUDA平台显示驱动程序都包含在GPU上执行任何操作的时间限制。这是为了防止显示冻结足够长的时间,从而导致操作系统内核死机或用户死机并认为机器已崩溃。在您使用的windows平台上,时间限制约为2秒。

部分误导您认为问题的根源是数组寻址,是代码的注释使问题消失。但真正发生的是编译器优化的工件。当你注释掉一个全局内存写操作时,编译器会识别出导致值被存储的计算是未使用的,并从它发出的汇编程序代码中删除所有这些代码(更多信息,请使用google "nvcc dead code removal“)。这样做的效果是使代码运行得更快,并将其置于显示驱动程序的时间限制之下。

有关解决方法,请参阅this recent stackoverflow question and answer

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7102166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档