我目前正在使用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++庫,這是可以接受的我猜。
在此先感謝您的幫助。
在C++/CLI中創建一個類庫。您可以在使用#pragma非託管編譯的代碼中使用SSEx intrinsics。然而,您將永遠無法獲得單個SSE4指令的效率,從託管代碼執行切換到非託管代碼會產生開銷。花費大約5納秒,加上編組參數所涉及的任何開銷,以及將變量對齊到16所需的不可避免的副本。您的本機代碼必須足夠大以分攤成本。 –
「自從2006年推出SSE4以來,人們可以放心地假設現在每臺現代計算機都有它。」 - Penryn(英特爾)是2008年1月,推土機(AMD)是2011年10月。如果您沒有SSE2的後備代碼,將分別在英特爾和AMD的這些日期之前的任何CPU上崩潰。 – Asik
你可以使用opencl包裝。 –