2011-04-21 18 views
1

我目前正在研究用C++和C#編寫的(遺留)程序;它執行一些重量級的計算,但應該是完全確定性的。即相同的輸入會產生相同的輸出......問題是2次運行(在同一臺計算機上,使用相同的編譯可執行文件)會產生稍微不同的輸出。在確定性應用程序中的偏差

應用程序讀取和寫入到SQL服務器數據庫(它具有對數據庫的唯一訪問權限,因此沒有其他應該干涉DB值)。

運行之間唯一明顯的區別是它們每個都被賦予一個唯一的名稱(只是一個字符串變量)。

代碼中沒有隨機對象,所有循環都運行預定次數的迭代,或者直到遇到條件,它們才運行一定的時間。有少量的多線程,我已經保證是線程安全的,但我會自己檢查一下。

有沒有其他明顯的事情我應該尋找,這會導致這種不正常的行爲?

回答

2

兩個想法發生對我說:

  • uninitiased變量。
  • 浮點運算不關聯。

後一點可以在多線程下產生機器精度級別差異。不過,這很可能是未經初始化的變量!

+0

感謝您的回答,大衛。關於你的第二點,我是否認爲在同一臺服務器上運行時,所有的浮點運算至少是一致的? – ninjaPixel 2011-04-26 16:18:46

+0

如果存在線程將計算分割到不同的線程上,那麼可能不是 – 2011-04-26 19:04:09

+0

您能給出一個具體的例子,爲什麼以及何時在同一個處理器上的相同計算可能產生不同的結果(給出正確的同步)? – user492238 2011-04-29 08:40:47

2

如果是C++,那麼另一件事是內存分配。有可能某個值沒有在某個地方被初始化,因此當時在內存中發生了任何值。

0

根據定義的輸入設置確定性。

你的數據庫在重播之間重置?也許數據庫的備份和恢復是有序的,並且您的後續測試應該從數據庫的新恢復中執行。如果有效,那麼您需要返回設計文檔,根據數據庫輸入確定是否允許不同的輸出。

如果設計文檔不允許根據數據庫輸入的不同輸出,那麼你的程序不是按規範構建的。

如果你的程序產生與輸入相同數據庫的不同輸出,那麼它可能在某處讀取時間(可能存儲一個時間戳),在這種情況下,它根本不能被認爲是100%確定性的。

無論哪種方式,你可能有更多的輸入到算法比你跟蹤,因此不確定性。

1

一些可能的原因進入腦海:

  • 浮點運算可能會在32個VERS稍有不同的結果。 64位
  • 某些迭代算法可能會使用某種隨機性來初始化某些起始向量或者如此
  • 某些實現可能使用第三方庫 - 預安裝在系統上。 LAPACK或FFTW是一些候選人。他們可能有不同的版本,也可能導致這種情況。
相關問題