2017-08-11 67 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将不可行。

换句话说,这些比较方法不是为了通用目的。