PyCUDA/CUDA: 非确定性启动失败的原因?
关注CUDA的朋友们可能见过我关于一个项目的一些提问,如果你没见过,我来简单总结一下。(提前抱歉问题有点长)
这个项目涉及三个核心程序。第一个程序根据一些输入变量生成数据集(因为涉及到比特组合,所以数据量可能会迅速增加),第二个程序解决这些生成的线性方程组,第三个程序则是用来得到最终结果的归约程序。这三个核心程序在一个特定系统的优化算法中反复运行。
在我的开发机器上(Geforce 9800GT,使用CUDA 4.0),这个程序运行得非常顺利,无论我给它什么数据(只要不超过计算限制),都能正常工作。但在测试机器上(4个Tesla S1070,只用了一台,使用CUDA 3.1),同样的代码(基于Python,使用PyCUDA与CUDA核心程序交互),在处理“小”数据时结果完全正确,但在中等规模的数据时,解决阶段会在随机的迭代中失败。
之前我遇到过的问题主要是因为数值不稳定,且每次失败的阶段都是固定的(也就是说,每次都在同一个地方出错),但这次的问题让我很烦,因为它随时可能失败。
因此,我没有可靠的方法将CUDA代码从Python框架中分离出来进行调试,而PyCUDA的调试支持也不太靠谱。
我检查了常见的问题,比如在调用核心程序前检查设备上的可用内存,计算的网格和块分配也显示正常。我没有使用任何特定于4.0版本的复杂功能,每次迭代我都会释放在设备上分配的所有资源,并且我已经将所有数据类型固定为浮点数。
总结一下,有没有人遇到过关于CUDA 3.1的坑,我在发布说明中没有看到,或者有关于PyCUDA的自动初始化内存管理环境的问题,导致在重复调用时出现间歇性失败?
2 个回答
-1
你可以使用nVidia的CUDA性能分析工具,看看在出错之前执行了哪些操作。
4
你试过这样做吗:
cuda-memcheck python yourapp.py
你可能遇到了越界访问内存的问题。