2013-05-27 36 views
3

我目前正在使用C#編寫一個應用程序,這可能會從使用SSE中獲益很多,因爲相對較小的一段代碼會導致90-95%的執行時間。代碼本身對SSE來說也是完美的(因爲它是基於矩陣和矢量的),所以我繼續開始使用Mono.Simd,即使這在執行時間上有很大的差異,但這還不夠。 Mono.Simd的問題在於它只有很老的SSE指令(主要來自SSE1和SSE2,我相信),這導致點積(或標量/內積)例如佔用3條指令,而它可以是隻用1條指令就可以實現SSE4(並且自從2006年以來SSE4就可以使用,人們可以放心地假定每臺現代計算機都有它)。此外,其他一些功能根本不包括在內(例如,獲取每個數字的絕對值,這也需要一個笨拙的解決方法)。在C#中使用SSE#

我的問題是,有沒有其他庫可以從我的C#代碼中調用以利用SSE/SIMD?也可以在C#中使用內聯彙編,因此顯然我也可以使用C++代碼,即使這會導致性能下降,但如果任何人有相對易於使用的具有上述功能的C++庫,這是可以接受的我猜。

在此先感謝您的幫助。

+1

在C++/CLI中創建一個類庫。您可以在使用#pragma非託管編譯的代碼中使用SSEx intrinsics。然而,您將永遠無法獲得單個SSE4指令的效率,從託管代碼執行切換到非託管代碼會產生開銷。花費大約5納秒,加上編組參數所涉及的任何開銷,以及將變量對齊到16所需的不可避免的副本。您的本機代碼必須足夠大以分攤成本。 –

+2

「自從2006年推出SSE4以來,人們可以放心地假設現在每臺現代計算機都有它。」 - Penryn(英特爾)是2008年1月,推土機(AMD)是2011年10月。如果您沒有SSE2的後備代碼,將分別在英特爾和AMD的這些日期之前的任何CPU上崩潰。 – Asik

+0

你可以使用opencl包裝。 –

回答

11

開放源代碼Yeppp! library(其中我是作者)提供了SIMD優化的數據處理功能,可以通過官方綁定從.Net語言中使用。它不僅支持SSE,而且還支持即將推出的Intel Haswell處理器的AVX2以後的SIMD擴展。該庫自動爲其運行的處理器選擇最佳版本。

+0

這看起來很有希望,我將如何在我的代碼中使用它(我在單聲道中使用c#,爲一個統一的項目,所以它會很好,如果它可以同時運行Windows和Mac)?有沒有一個DLL,或者是否有可能使一個可用於MacOS,也可以使用全部(或大部分)優化? –

+0

它在Linux的Mono下工作(明顯在Windows下的.Net下),但Mac目前不支持。 –

+0

下載最新的正式版本,您將在二進制目錄中找到預構建的文件 –

2

截至2013年4月,Steam Survey reports that only 64% of PCs have support for SSE4.1。換句話說,如果你承擔SSE4.1的支持,你將會在大約三分之一的消費者PC上崩潰。

我對Mono.Simd並不熟悉,但如果您可能不屑於編寫合適的C++/CLI包裝器,那麼在Windows上的一個很好的選擇是DirectXMath。兩者都不會利用所有最新的說明,但您可以根據需要相對輕鬆地在intrinsics的基礎上補充這些說明。我不確定你會做得比Mono.Simd好得多。

在C#中沒有「內聯彙編」這樣的東西;如果你想從C#中使用C++或彙編代碼,你必須通過P/Invoke或C++/CLI包裝來調用它。除此之外,C++/CLI的開銷更小。這就是說,如果你需要優化一小段代碼,最好的選擇可能是完全用本地C++重寫那段代碼。

+0

這現在已經廣泛變化:)(謝天謝地) – JeromeJ