2011-08-10 37 views
2

我想與英特爾的SSE一起邁出第一步,所以我遵循指南here,區別在於不是爲Windows和C++開發,而是爲Linux和C開發(因此我請勿使用任何_aligned_malloc,但posix_memalign)。SSE優化代碼執行類似於普通版本

我還實現了一個不使用SSE擴展的密集計算方法。令人驚訝的是,當我運行這個程序時,兩個代碼片段(一個與SSE相關,另一個沒有)運行的時間相似,通常是使用SSE的時間略高於其他時間。

這是正常的嗎? GCC是否可以通過SSE進行優化(也使用-O0選項)?我也嘗試了-mfpmath=387選項,但沒辦法,依然如此。

+0

你在用什麼CPU? –

+0

我使用英特爾酷睿i7 M640 2.80GHz –

+0

行 - 請參閱下面的答案,您可能還想發佈您的代碼和您用於構建它的命令行。 –

回答

2

對於浮點運算,您可能看不到SSE帶來的巨大收益。大多數現代x86 CPU都有兩個FPU,所以雙精度的SIMD和標量的速度可能差不多,單精度可能會給你兩倍的SIMD標量。對於整數運算,例如圖像或音頻處理8位或16位,您仍然可以從SSE獲得實質性好處。

+0

這可能是原因。我會嘗試一個精確的版本。 –

+1

確定 - 儘管將代碼和命令行添加到您的問題中 - 開始使用SIMD時可能出錯的事情太多了。 –

+2

你是對的,Paul R.使用32位整數的版本加快了約2倍的加速。我想在16位和8位操作中,好處會更好。順便說一下,我刪除了整數版本中的平方根操作。非常感謝。 –

1

GCC有一個非常好的內置代碼向量化器(iirc在-O0及以上版本中啓用),所以這意味着它將在任何可以加速標量代碼的地方使用SIMD(它也會優化SIMD代碼也有點可能)。

它很容易確認這確實是最新發生在這裏,只是反彙編輸出(或有gcc發出註釋的asm文件)。

+0

我檢查了彙編代碼,我只是看到了一段addps指令,我希望從這段代碼中明確指出(至少)SSE。 –

+1

我懷疑自動矢量化在O0(沒有優化)時發揮作用,因爲它是一個非常重的優化,只應該在O2或O3中進行。 –

+0

如果你看看gcc手冊頁,它說「-ftree-vectorize」由「-O3」設置。這在Debian/Ubuntu上,它可能在其他平臺上有所不同。小心,'-O0'是0優化。優化開始於'-O1' –