【发布时间】:2011-08-15 04:40:25
【问题描述】:
任何关注 CUDA 的人都可能已经看到了我对我参与的项目的一些查询,但对于那些没有关注的人,我会总结一下。 (抱歉提前问了这么长的问题)
三个内核,一个基于一些输入变量生成一个数据集(处理位组合,因此可以指数增长),另一个解决这些生成的线性系统,另一个缩减内核以获得最终结果。这三个内核作为特定系统优化算法的一部分反复运行。
在我的开发机器(Geforce 9800GT,在 CUDA 4.0 下运行)上,无论我向它扔什么(达到基于所述指数性质的计算限制),它始终都能完美运行,但在测试机器上(4xTesla S1070,仅使用一个,在 CUDA 3.1 下)完全相同的代码(Python 基础,到 CUDA 内核的 PyCUDA 接口),在“小”情况下产生准确的结果,但在中等情况下,求解阶段随机失败迭代。
我之前遇到的代码问题与问题的数值不稳定性有关,并且本质上是确定性的(即每次都在完全相同的阶段失败),但坦率地说,这个问题让我很生气,因为它会随时失败。
因此,我没有可靠的方法将 CUDA 代码从 Python 框架中分离出来并进行适当的调试,而且 PyCUDA 的调试器支持至少可以说是有问题的。
我已经检查了通常的事情,比如内核调用前检查设备上的空闲内存,占用计算表明网格和块分配很好。我没有做任何疯狂的 4.0 特定的东西,我在每次迭代时释放我在设备上分配的所有内容,并且我已将所有数据类型固定为浮点数。
TL;DR,有没有人遇到过我在发行说明中没有看到的关于 CUDA 3.1 的任何问题,或者 PyCUDA 的自动初始化内存管理环境有任何问题会导致间歇性启动失败重复调用?
【问题讨论】:
-
简短的回答是否定的。 PyCUDA autoinit 实际上只是一个上下文建立和释放机制,它没有做任何神奇的事情。我所能推荐的就是确保对所有内核进行大量错误检查。看看这两个编译器生成的 PTX 可能也值得一看,看看它们是否完全不同。如果您有兴趣,仍然可以在其他硬件上测试您的代码。
-
唯一一次我遇到看似随机的内核故障,问题是导致负索引的错误。只有当 cudaMalloc 将 0x0 分配给相关指针时才表现出来,这是不一致的。祝你好运……
-
我将留下这个问题,因为它涉及 3.1 和 4.0 之间的差异;我无法在 4.0 上复制我在 3.1 中看到的故障,也没有出现任何合理的解释。如果有人遇到这个问题寻找答案;升级到 4.0