近年来,我们在许多 64 位项目中将 CUDA 用于时间关键型任务。几天前,我更新了我的开发系统上的 nvidia 驱动程序,发现与 CUDA 相关的算法出现了灾难性的减速。经过一番挖掘,很明显 cudaMalloc 的许多连续调用会导致延迟增加(每次下一个调用):
void *p[65000];
for (int n = 0; 65000 > n; n++)
cudaMalloc(&p[n], 256);
此代码在最高版本 285 的 nvidia 驱动程序上运行大约 4 秒,但从驱动程序版本 285 开始执行此代码需要 8 分钟以上(慢 120 倍)。在不同 x64 系统上的 GeForce GTX 560Ti、GeForce GTX 460 和 Quadro FX4600 上进行了测试。
好吧,问题是:这是新驱动程序的错误吗?或者,也许是某种尝试处理碎片和改进 CUDA 中的内存管理(通过更复杂的分配)?或者是其他东西?
更新:我已经向 nvidia 报告了这个问题,并得到答复,他们能够重现它并已将其分配给调查。