【问题标题】:CUDA Convex Hull program crashes on large inputCUDA Convex Hull 程序在大输入时崩溃
【发布时间】:2011-10-29 10:50:54
【问题描述】:

我正在尝试在 CUDA 中并行实现 quickHull 算法(用于凸包)。它适用于 input_size

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

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)时,我的代码崩溃了。我无法解释该错误,因为 farthestPoint 始终在 old_set 数组大小的范围内。 Old_setS 存储每个线程可以操作的较小数组的大小。即使只是尝试打印 farthestPoint(最后一行)的值而没有上面的数组访问语句,它也会崩溃。

输入大小

请帮我找出崩溃的根源。

【问题讨论】:

  • 尝试检查崩溃地址的实际值。它可能无法寻址。
  • 当你说“崩溃”是什么意思?您是从 Windows 平台上的 WDDM 驱动程序中收到“windows 设备停止响应并已重置”错误,还是其他原因?
  • @talonmies :我的程序崩溃,屏幕显示关闭一秒钟并返回此错误:“显示驱动程序 NVIDIA windows 内核模式驱动程序,版本 275.33 停止响应并已成功恢复。”我的可执行文件突然关闭。

标签: c++ gpgpu gpu cuda


【解决方案1】:

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

您的内核正在被显示驱动程序杀死,因为在显示 GPU 上执行需要花费太多时间。所有 CUDA 平台显示驱动程序都包含对 GPU 上的任何操作的时间限制。这样做是为了防止显示器在足够长的时间内冻结,以至于操作系统内核崩溃或用户恐慌并认为机器已经崩溃。在你使用的windows平台上,时间限制是2秒左右。

部分误导您认为问题的根源是数组寻址是代码注释使问题消失。但真正发生的是编译器优化的产物。当您注释掉全局内存写入时,编译器会识别出导致值被存储的计算未被使用,并从它发出的汇编代码中删除所有代码(谷歌“nvcc 死代码删除”以获取更多信息)。这样可以使代码运行得更快,并将其置于显示驱动程序的时间限制之下。

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

【讨论】:

  • 感谢您的信息。在崩溃的步骤中,我运行了 2 个线程,它们最多运行 600 万次 O(1) 计算,这可能不会超过几秒钟。在未来对内核的调用中,将有更多的线程和更少的计算,但最初它以大约 2 个线程开始,负载分别为 350 万和 650 万,这仍然可能不会触发驱动程序重置事件对..?
  • 2 个线程?那是你问题的根源。这可能占用了 GPU 总计算能力的 0.5%,并解释了为什么它如此缓慢。您的 GPU 每 MP 需要 192 到 384 个活动线程,才能覆盖 GPU 中的所有架构延迟,通常每个 CUDA 会运行几万到几百万个线程内核启动。听起来您应该阅读 SDK 随附的 CUDA 最佳实践指南,以更好地了解如何有效地使用 GPU。
  • 好吧,在调用这个内核之前,我也会尝试使这一步并行。我在以后的调用中每次启动 CUDA 内核都会创建数千到百万个线程,但最初只是从 2 个负载很重的线程开始。只是想知道,请让我知道每个 CUDA 线程的运行速度/秒。谢谢。
  • 那是“一根绳子有多长?”问题 - 没有答案。从根本上说,线程没有速度,运行它们的硬件有。但是硬件也有很多延迟。提供足够多的线程是程序员的工作,这样硬件总是有工作要做,架构的延迟可以成功隐藏。
猜你喜欢
  • 2015-02-05
  • 2018-10-15
  • 2012-05-17
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多