【发布时间】: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 停止响应并已成功恢复。”我的可执行文件突然关闭。