C++数百万次执行后程序的稳定性

C++ program stability after millions of executions

本文关键字:程序 稳定性 执行 数百万 C++      更新时间:2023-10-16

我在C++中有一个程序,主要执行矩阵乘法、加法等。

问题是,当计算执行大约 300 万次时,会发生EXC_BAD_ACCESS。

当问题执行数百万次和几个小时时,是否会出现任何可能的问题?

节目详情:

该程序只是对不同范围的值进行计算,因此它同时在 6 个线程上执行。线程之间没有资源共享。

该程序似乎没有明显的问题,因为:

  1. 没有内存泄漏,我已经使用仪器确认了这一点,并且程序的内存大小是稳定的。
  2. 该程序可以在每个线程上执行至少 200 万次而没有任何问题,但几乎可以保证EXC_BAD_ACCESS异常会在某个线程上出现一段时间。(异常发生在我尝试该程序的 2 次 (2/2) )

关于矩阵乘法:

有时矩阵的大小约为 2*2

乘以 2*1000。

矩阵的元素是自定义复数类。

元素的值由 Rand() 随机生成并转换为浮点数。

结构是这样的:

class Complex
{
private:
    float _real, _imag;
public:
   // getters, setters and overloaded operators
};
class Matrix
{
private:
    Complex **_values;
    int _row,_col;
public:
     getters, setters and overloaded operators
};

谢谢!

非常欢迎任何可能的崩溃原因!

EXC_BAD_ACCESS表示您取消引用了一个不指向进程当前内存空间的指针。这是代码中的一个错误。在调试器下运行它,直到它失败,然后查看它失败的语句中的变量值。它可能很简单,也可能非常微妙。

您的帖子中的信息太少,无法做出决定性的答案。但是,现在可能没有可用的信息会更改它,您需要更仔细地调试案例。这就是我要做的。

若要调试,需要可重复性。但。。。你说你使用的是随机数。不过,似乎你的程序所做的是一些科学的计算。在大多数情况下,您实际上不需要"真正的"随机性,而是"可重复的"随机性 - 通过统计测试的随机性,但您有足够的数据来重置随机数生成器,以便它产生与上次运行完全相同的结果。为此,您可以在每次开始新的计算块时写下当前的 RNG 状态(例如种子)。

现在,编写一些代码,每隔几分钟存储一次重新启动计算(包括 RNG)所需的所有状态,并运行程序。这样,如果您的代码崩溃,您将能够以相同的确切状态重新启动计算,并达到崩溃的程度,而无需等待数百万次迭代。我在这里提出了一个强有力的假设,即除了 RNG 之外,您的代码不依赖于任何其他类型的外部状态(例如,网络活动、IO、进程调度程序在调度线程时做出某些选择......

使用此类数据,将更容易测试问题是否是由于机器故障(过热,内存损坏等)引起的。只需在崩溃之前以最后一个状态重新启动计算——最好是在让机器冷却后,也许重新启动它......如果您会遇到另一次崩溃(每次尝试重新启动代码时都会发生崩溃),可以肯定这是由于代码中的错误造成的。

如果不是,我们仍然不能说这是机器故障 - 您的代码可能会(纯粹是偶然/代码中的错误)由于未定义的行为而崩溃,这取决于您无法控制的因素。示例包括在很少使用的代码路径中使用未初始化的指针:它有时可能会引发错误的访问,并且如果指针指向您分配的内存,则不会被注意到。试试valgrind,这可能是检查内存问题的最佳工具......除了它大大减慢了执行速度,以至于您再次希望从已知可疑的状态(崩溃前的最后一个状态)重新运行计算,而不是等待数百万次迭代。我看到了 5 倍到 100 倍的减速。

同时,请尝试在另一台计算机上运行代码。如果你在类似的迭代次数后也会崩溃(以确保等待至少 3 倍于在原始机器上崩溃的迭代次数),那么很可能是代码中的错误。

快乐黑客!

有限精度的计算在几百万次迭代后失败?这可能是累积的舍入误差。问题是,这些通常表现为除以零或其他数学错误。 EXC_BAD_ACCESS不是。但是,在一种情况下可能会发生这种情况:当您使用数学结果作为数组索引时。