System.Numerics.Vector.GreaterThan和布尔结果
问题描述:
我想转换一些现有的代码,可以使用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);
}
有没有一种技术,我可以用它来有效地把结果res
到result
阵列?
更新1
原本我以为我可以Vector<long>
生活,并保持口罩long[]
但我意识到,也许这是不可行的。
答
正如对原始问题的评论,我认识到System.Numberics.Vector.GreaterThan
和其他类似的方法,如LesserThan
等被设计为与ConditionalSelect()
一起使用。
在我的情况下,我试图生成一个bool
数组,代表后来在整个API中使用的图像蒙版,并将long转换为bool将不可行。
换句话说,这些比较方法不是为了通用目的。
当然,你不*真的*想要一个长的[]?您通常需要使用ConditionalSelect()next来使用比较结果来生成新的Vector。注意无故使用Parallel.For(),Random类不是线程安全的。 –
@HansPassant是的,我发布后发现'Vector'是为'ConditionalSelect()'而设计的,我可能想用它来代替。尽管如此,我还需要转换一些手动屏蔽代码。我正在考虑不会泄露代码库上层的这个实现细节的方法......也许我需要引入一个类的封装器......并且感谢“随机”线程安全性,在发布后,我也意识到数组中包含很多0,因为那... –
当你问完所有这些事情后才知道所有这些问题吗?它只是浪费人们的时间,请删除它。 –