我一直在尝试使用Vector来使用 HW 来并行化整数运算。有没有办法通过向量操作启用溢出检查?
一个例子是将两列(等长数组)的整数加在一起。这里c=a+b
表示c[0] = a[0] + b[0]
,c[1] = a[1] + b[1]
等。
我想我可以做这样的事情:
overflow[i] = b[i] >= 0 ? c[i] < a[i] : c[i] >= a[i];
但这(分支)可能比 .Net 的自动溢出检查慢,并且可能会抵消使用 .Net 的性能优势Vector<T>
。
我们还想优化我们最常用的运算:乘法、减法,以及较小程度的整数除法。
编辑:我想了更多,想出了这个,它比未经检查的向量加法慢 2.5 倍。似乎有很多额外的开销。
public Vector<int> Calc(Vector<int> a, Vector<int> b)
{
var result = a + b;
var overflowFlag = Vector.GreaterThan(b, Vector<int>.Zero) * Vector.LessThan(result,a)
+ Vector.LessThan(b,Vector<int>.Zero) * Vector.GreaterThan(result, a);
// It makes no sense to add the flags to the result, but haven't decided what to do with them yet,
// and don't want the compiler to optimise the overflow calculation away
return result + overflowFlag;
}
时序:(4k 次迭代添加一对 100k 数组)
- 正常添加:618ms
- 正常检查添加:1092ms
- 矢量添加:208ms
- 矢量检查添加:536ms