2015-12-03 94 views
0

基本上,我做了數以百萬計的非常簡單的計算,並試圖存儲最後打印的最高結果。我使用的是C#控制檯應用程序,但是這是很簡單的很語言無關尋找數百萬計算最大結果的最有效方法是什麼?

我有什麼(這會以另一種語言表現基本比較好?):

double output = 0; 
//do the calculations 
//after each: 
if(calculationResult > output) output = calculationResult; 
//done with calculations 
Console.WriteLine(output); 

這工作,但需要很長時間才能完成。我考慮將答案存儲在列表中並在計算後對其進行排序,但它以9GB左右的OutOfMemory崩潰。

比較直播和只存儲一個需要很長時間,但存儲所有內容並稍後進行比較需要太多內存。有什麼辦法可以優化嗎?

編輯:我的解決方案是先到達由答案形成的拋物線的頂點後移動一半的計算數。然後我意識到最好的解決方案是重構所有的東西以遞歸,從低精度和寬範圍開始,然後在提高精度的同時縮小範圍。使用英特爾IPP移植到C++僅提供了約8%的完成時間減少,而操作的減少約爲99%。我現在正在處理遞歸,並將回報。

+0

除了優化計算之外,還可以顯示進度(使用進度條,以當地最大值),並在達到絕對最大值時停止。 –

回答

2

正如馬修所說,你需要提高這個過程的效率。除了找到更好的算法,以下是一些建議:

  1. 計算是否相互依賴?你可以多線程並將它們分佈到多個內核中嗎?
  2. 你可以矢量化他們,意思是使用SSE,AVX,AVX2等?
  3. 使用一個好的優化編譯器,如Intel的。它是最好的優化編譯器之一。它會在很多情況下自動並行處理。
  4. 重構您的代碼以利用緩存層次結構並儘量減少錯失。
  5. 如果你可以做1和2,你可以得到顯着的加速。例如,如果您有一臺帶有超線程技術的四核心計算機和AVX256,則您有8個虛擬內核並行運行,每個執行AVX256(4個雙精度值),允許您並行執行32個計算。如果您使用的服務器級機器帶有2個插座和32個內核,每個運行AVX512,您可以想象在理想條件下的加速。
  6. 找到一個算法,允許您利用上述。
  7. 使用Fortran。我不是在開玩笑。對於數值計算,它不能被擊敗。並且它在存儲數據方面避免了很多優化問題。

看看Intel's site。他們希望您能夠以各種原因儘可能多地利用並行性,我不會在這裏進行討論。

0

幾乎可以肯定什麼是慢的計算步驟,而不是if(calculationResult > output) output = calculationResult;部分。

我不知道你的特定問題是什麼,但通常最有效的方式來找到最大的數以百萬計的計算是仔細考慮你的問題,並使用更有效的算法和/或數學所以你不'不得不作出數百萬計算

+0

謝謝。我的情況涉及拋物線,所以我可以在通過頂點後跳到下一個集合,基本上減半。 – killmgood

相關問題