Browse Source

Add better version of ReduceSum for Vector 256

pull/1848/head
Brian Popow 5 years ago
parent
commit
5403fbd8b2
  1. 13
      src/ImageSharp/Common/Helpers/Numerics.cs

13
src/ImageSharp/Common/Helpers/Numerics.cs

@ -828,11 +828,16 @@ namespace SixLabors.ImageSharp
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int ReduceSum(Vector256<int> accumulator) public static int ReduceSum(Vector256<int> accumulator)
{ {
Vector128<int> vec0 = Avx2.ExtractVector128(accumulator, 0); // Add upper lane to lower lane.
Vector128<int> vec1 = Avx2.ExtractVector128(accumulator, 1); Vector128<int> vsum = Sse2.Add(accumulator.GetLower(), accumulator.GetUpper());
Vector128<int> sum128 = Sse2.Add(vec0, vec1);
return ReduceSum(sum128); // Add odd to even.
vsum = Sse2.Add(vsum, Sse2.Shuffle(vsum, 0b_11_11_01_01));
// Add high to low.
vsum = Sse2.Add(vsum, Sse2.Shuffle(vsum, 0b_11_10_11_10));
return Sse2.ConvertToInt32(vsum);
} }
/// <summary> /// <summary>

Loading…
Cancel
Save