2011-11-21 78 views
7

反正有人用SIMD的方式在陣列中添加元素「矢量化」嗎?C#矢量化陣列添加

例如,我想談談:

var a = new[] { 1, 2, 3, 4 }; 
var b = new[] { 1, 2, 3, 4 }; 
var c = new[] { 1, 2, 3, 4 }; 
var d = new[] { 1, 2, 3, 4 }; 

var e = new int[4]; 

for (int i = 0; i < a.Length; i++) 
{ 
    e[i] = a[i] + b[i] + c[i] + d[i]; 
} 

// e should equal { 4, 8, 12, 16 } 

成類似:

var e = VectorAdd(a,b,c,d); 

我知道的東西在C++/XNA庫可能存在,但我不知道我們在標準的.Net庫中有它。

謝謝!

+0

我覺得像你寫的那樣簡單的循環是通過優化編譯器進行矢量化的。 – Tudor

回答

13

你會想看看Mono.Simd:

http://tirania.org/blog/archive/2008/Nov-03.html

它支持SIMD在C#

using Mono.Simd; 


//... 
var a = new Vector4f(1, 2, 3, 4); 
var b = new Vector4f(1, 2, 3, 4); 
var c = new Vector4f(1, 2, 3, 4); 
var d = new Vector4f(1, 2, 3, 4); 

var e = a+b+c+d; 
+0

僅供參考您可以使用該組件,但如果它在單聲道CLR中運行並且支持它們,它將僅使用SIMD指令。 – redcalx

2

我想這一切都取決於你在做什麼,但如果你是擔心矢量化矢量總和,你可能想看看一個庫,如Math.NET,它提供了優化的數值計算。

從他們的網站:

它的目標是微軟.NET 4.0,單聲道和Silverlight 4,並且除了純粹的管理的實施也將支持原生硬件優化(MKL,ATLAS)。

5

Mono提供了一個相對體面的SIMD API(如上所述),但如果Mono不是一個選項,我可能會編寫一個C++/CLI接口庫來完成繁重的工作。對於大多數問題集,C#都能很好地工作,但是如果您開始使用高性能代碼,那麼最好使用能夠控制性能的控制語言。

在這裏我們使用P/Invoke來調用C#編寫的用C++編寫的圖像處理例程。 P/Invoke有一些開銷,但是如果你撥打很少的電話並在本地進行大量的處理,這可能是值得的。

+0

次佳,+1 – sehe