2013-09-21 62 views
1

我在C++中有一个程序,主要执行矩阵乘法,加法运算等等。经过数百万次执行后的C++程序稳定性

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

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

详细说明:

该方案是简单地在不同范围的值的计算,所以它是在同一时间上6个线程执行。线程之间没有资源共享。

似乎是因为该方案没有明显的问题:

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

关于矩阵乘法(除了在我的2次节目的尝试(2/2)发生):

有时矩阵的大小约为2 * 2乘2 * 1000。

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

元素的值由rand()随机生成并转换为float。

的结构是这样的:

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 
}; 

非常感谢您!

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

+2

'EXC_BAD_ACCESS'通常意味着代码中的错误或硬件不稳定。 – Mysticial

+0

不看实际的代码很难说。 – Escualo

+0

#Mystical:好的......有问题的可能性......这只是对我而言还不清楚......请给我一些关于错误类型的提示吗?啊...不稳定的硬件是可能的...我使用Mac OS X 10.8,Xcode 5和llvm 5,似乎这种类型的科学计算在ubuntu中更好。不知道编译器上的任何调整是否有帮助... – Lewen

回答

2

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

+0

是的,进程的内存空间......它似乎是解决方案,正如#Graham Perks上面也指出的那样,问题似乎与线程有关。 – Lewen

+0

这个问题确实与内存空间有关,也许#Graham Perks已经更清楚地指出了这一点,但是当我没有多线程运行程序时,无论我想要多少次,它都可以循环。 – Lewen

1

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

要进行调试,您需要重复性。但是......你说你在使用随机数字。看起来,虽然你的程序做的是一些科学计算。在大多数情况下,你实际上并不需要“真正的”随机性,而是通过统计测试的“可重复的”随机性随机性,但是如果你有足够的数据来重置随机数发生器,那么它就会产生完全相同的结果之前的跑步。为此,每次开始一个新的计算块时,您可以只写下当前的RNG状态(例如种子)。

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

使用这种的数据,如果问题是由于机器故障(过热,内存不足等),将更容易测试。只需在崩溃前用最后一个状态重新启动计算 - 最好让机器冷却下来,或许重新启动它......如果您遇到另一次崩溃(并且每次尝试重新启动代码时都会发生这种情况),可以肯定的是这是由于您的代码中存在一个错误。

如果没有,我们还不能说这是机器故障,您的代码可能(通过在代码纯属意外/错误)崩溃,由于这取决于多种因素,你无法控制的不确定的行为。例子包括在一个很少使用的代码路径中使用一个未初始化的指针:它有时可能会导致错误的访问,并且如果纯运气指针指向您分配的内存,就会被忽视。尝试valgrind,这可能是检查内存问题的最佳工具......除了它会减慢执行速度以至于再次选择从已知可疑状态(崩溃前的最后一个状态)重新运行计算而不是等待数百万次迭代。我已经看到5倍到100倍的放缓。

与此同时,尝试在另一台机器上运行您的代码。如果在迭代次数相似的情况下也会发生崩溃(确保至少等待迭代次数比原始机器崩溃至少多3倍),那么很可能它是代码中的一个错误。

快乐黑客!

+0

谢谢你的提示!是的,我正在做一些科学计算和使用C++,因为它比Matlab更快地编写OO代码和方法。我将检查valgrind是否有内存访问问题,并尝试记录RGN状态。 – Lewen

0

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

+0

谢谢,但问题很可能与线程和内存覆盖有关,如#Graham Perks和#EJP在上面指出的那样。我已经将程序从6个线程更改为4个线程,它已经运行了11个小时54分钟,并且没有问题。 – Lewen