2017-08-11 77 views
-1

我想轉換一些現有的代碼,可以使用SIMD指令進行優化。有一個掩碼生成代碼,我正在測試轉換後可以從SIMD中獲得多少性能,下面是我用來分析它的一個過於簡化的塊。System.Numerics.Vector.GreaterThan和布爾結果

Random r = new Random(); 
var random1 = new double[65536000*4]; 
var random2 = new double[random1.Length]; 
var result = new bool[random1.Length]; 
for (i = 0; i < random1.Length; i++) 
{ 
    random1[i] = r.Next(); 
    random2[i] = r.Next(); 
} 

var longRes = new long[random1.Length]; 
for (int i = 0; i < result.Length; i += Vector<double>.Count) 
{ 
    Vector<double> v1 = new Vector<double>(random1, i); 
    Vector<double> v2 = new Vector<double>(random2, i); 
    Vector<long> res = System.Numerics.Vector.GreaterThan(v1, v2); 
    res.CopyTo(longRes, i); 
} 

有沒有一種技術,我可以用它來有效地把結果resresult陣列?

更新1

原本我以爲我可以Vector<long>生活,並保持口罩long[]但我意識到,也許這是不可行的。

+0

當然,你不*真的*想要一個長的[]?您通常需要使用ConditionalSelect()next來使用比較結果來生成新的Vector。注意無故使用Parallel.For(),Random類不是線程安全的。 –

+0

@HansPassant是的,我發佈後發現'Vector '是爲'ConditionalSelect()'而設計的,我可能想用它來代替。儘管如此,我還需要轉換一些手動屏蔽代碼。我正在考慮不會泄露代碼庫上層的這個實現細節的方法......也許我需要引入一個類的封裝器......並且感謝「隨機」線程安全性,在發佈後,我也意識到數組中包含很多0,因爲那... –

+0

當你問完所有這些事情後才知道所有這些問題嗎?它只是浪費人們的時間,請刪除它。 –

回答

0

正如對原始問題的評論,我認識到System.Numberics.Vector.GreaterThan和其他類似的方法,如LesserThan等被設計爲與ConditionalSelect()一起使用。

在我的情況下,我試圖生成一個bool數組,代表後來在整個API中使用的圖像蒙版,並將long轉換爲bool將不可行。

換句話說,這些比較方法不是爲了通用目的。