2013-09-21 83 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