我正在研究一个大型科学代码,以便在群集上以非交互方式运行。该代码使用单例方案将大矩阵存储在存储器中,以便重复进行未来的乘法运算。最近代码一直崩溃,通常在分配某些类型的这些矩阵后不久,我们的异常处理程序返回输出如下:
## std :: bad_alloc在TerminateHandler中被捕获##########新的内存不足 峰值RSS内存= 905179136字节
################################################## #####
当前RSS内存= 905179136字节
每个进程应该至少有16 GB的RAM可用,因此很难看到我们如何已经耗尽了905179136字节的内存;此外,操作代码以使用更多或更少的内存导致程序仍然崩溃,但具有更小(更大)的值,用于峰值RSS内存'报道。
我可以想到两种可能性:
这可能与CUDA应用程序有关,并且矩阵正在CPU上构建,以便发送到GPU然后被删除。然而,GPU报告没有错误。
不幸的是,我无法在测试中重现错误,并且在崩溃之前在valgrind或gdb内运行的速度非常慢(即挂钟时间的几天)队列系统会导致我的工作失败。我的问题是如何区分这些可能性,或者其他可能存在的可能性?特别是有一些方法可以报告所有来电的大小'?'