2016-02-22 28 views
5

我一直在研究一個可執行圖像處理的便攜式C庫。如何在C中測試性能優化?

爲了利用GCC自動矢量化(SSE和/或AVX取決於目標處理器)模式,我在一些低級函數上投入了相當多的時間,同時仍然保留了一些可移植的C代碼(擴展使用:restrict__builtin_assume_aligned)。

現在是時間,以測試窗的代碼(MSVC編譯器)。但在此之前,我想設置一些單元測試,以免在腳中自我拍攝,並放棄所有我精心選擇的指令,以保持GCC自動矢量化代碼的原樣。

我可以簡單地#ifdef/#endif全身功能,但我想到一個更長期的解決方案,可以檢測編譯器更新任何迴歸。

我與單元測試相當有信心(有噸很好的框架在那裏的),但我是一個有很多這樣的低級功能單元測試缺乏自信。如何在CI服務中集成性能單元測試,例如jenkins?

PS:我想避免存儲基於特定的處理器上硬編碼的時序結果,如:

// start timer: 
gettimeofday(&t1, NULL); 
// call optimized function: 
... 
// stop timer: 
gettimeofday(&t2, NULL); 
// hard code some magic number: 
if(t2.tv_sec - t1.tv_sec > 42) return EXIT_FAILURE; 
+1

您是否具有非優化(通用)功能?比較執行時間w/them會更好...意味着't_opt'預計會小於't_non_opt' ...但即使這不是100%的擔保。其他進程可能會並行執行隨機磁盤訪問,您的測試可能會隨時被搶佔......並且其他一些事情可能不會在您的測試中發生...... – zaufi

+0

您瞄準什麼?你想確保在你的修改之後你的代碼仍然是正確的(那麼你將進行單元測試)還是你想檢查結果代碼的性能(這是不同的,可能以不同的方式接近)?在後一種情況下,您甚至可能需要打印出生成的彙編代碼,將其與您的期望進行比較。 –

+0

@DirkHerrmann這就是重點!如何打印'便攜式'彙編代碼?這可能取決於具體的gcc版本,如果您熟悉生成彙編代碼,請參閱其他詳細信息。 – malat

回答

-1


假設你有一些很好的理由使用MSVC,如果我是你爲了降低外圍干擾,我會盡可能保持低水平的方法。
因此,即使您更願意使用適當的框架進行測試,一個簡單的循環將使用預定義的參數調用您的關鍵函數,並將計時器連接到適當的位置,這樣可以提供比替代方案更可靠的結果。如果你可以計算出一些基本的平均和時序結果的標準偏差,你會有什麼發生的事情與性能,在何時何地變慢或比它應該做的更快等一個非常清晰的畫面......

1

你的問題基本上歸結爲兩部分:

  1. 什麼是性能基準你仔細優化的代碼的最佳方式是什麼?

  2. 如何,如果更改代碼和/或編譯器的更新影響了你的代碼的性能

google benchmark框架可能會提供一個合理的方法來解決#比較比較的結果,所以你可以檢測1。它是C++,但是這不會阻止你從它調用你的C函數。

這個庫可以產生各種格式,包括JSON和良好的老CSV總結報告。您可以安排將這些存儲在每次運行的某處。

然後,您可以編寫一個簡單的Perl/Python的/等腳本比較基準的結果,如果他們偏離超過一定的閾值發出警報。

有一件事你必須要小心,是造成變量,如進行測試的系統負載在搜索結果中的噪聲的可能性。您沒有多說關於運行測試的環境,但是如果它是(例如)包含其他VM的主機上的虛擬機,那麼測試結果可能會因其他虛擬機中發生的任何事情而偏斜。

諸如Jenkins這樣的CI框架允許您在運行測試時編寫腳本,因此將此方法集成到此類框架中應該相對容易。

1

以簡單和可重複的方式衡量性能的方法是通過valgrind/callgrind運行基準測試單元測試。這會給你一些指標: CPU週期,指令和數據讀寫事務(在不同的緩存深度),總線阻塞事務等。你只需要檢查這些值與已知的良好起始值。

Valgrind是可重複的,因爲它模擬代碼的運行。當然,它比直接運行代碼慢很多,但這使得它獨立於系統負載等。

Valgrind不可用,就像在Windows中一樣(雖然有提到valgrind + wine + Windows程序在Linux上),dynamoRIO是一個選項。它提供了類似於Valgrind的工具,如指令計數器,以及內存和高速緩存使用情況分析器。 (也可在Linux上使用,並且在撰寫本文時似乎已被半移植到OS X)

+1

不能在windows上移植,但至少可以提供比測試時間更多的細節。 – malat

+0

有提到valgrind +酒設置,但是,可能會變得複雜。 – hmijail

+0

@malat,如果你還在研究這個,我只是發現了一些可能與valgrind的各種Windows工具相同的東西:http://dynamorio.org/(檢查「指令計數工具計數」和「多進程在線緩存模擬器drcachesim「) – hmijail