近年来,我们在许多64位项目中使用CUDA进行时间关键任务。几天前,我在我的开发系统上更新了nvidia驱动程序,发现了与CUDA相关的算法的灾难性减速。经过一番挖掘后,很明显许多顺序调用cudaMalloc导致延迟增加(每次下一次调用):
void *p[65000];
for (int n = 0; 65000 > n; n++)
cudaMalloc(&p[n], 256);
此代码在nvidia驱动程序版本285上运行约4秒,但从驱动程序版本285开始执行此代码需要8分钟以上(慢120倍)。在不同的x64系统上测试了GeForce GTX 560Ti,GeForce GTX 460和Quadro FX4600。
嗯,问题是:它是新驱动程序的错误吗?或者,它是否可能是某种尝试在CUDA中处理碎片和改进内存管理(通过更复杂的分配)?或其他什么?
更新: 我已经向nvidia报告了这个问题,并且回答说他们能够复制它并将其分配给调查。
答案 0 :(得分:3)
我根据OP的错误报告跟踪了这个问题。事实证明这是一个已经报道过的已知问题,它已在CUDA 5.0中修复。如果您下载CUDA 5.0 预览版(可供注册的CUDA开发人员使用) Release Candidate或更高版本,您应该会看到改进。
编辑:修复程序将位于CUDA 5 RC中,而不是预览中。因此,在此编辑(2012年5月31日)中,修复程序尚不可用。