public static Vector128 <int>[,] Procedure(int[,] A, int[,] B, int a, Vector128 <int> x, Vector128 <int> y) { unsafe { int length = A.GetLength(0); int length2 = B.GetLength(1); int length3 = 0; int length4 = 0; try { length3 = length; length4 = length2 / 4; } catch (Exception e) { Console.WriteLine("Error"); } Vector128 <int>[,] MatrixA = new Vector128 <int> [length3, length4]; Vector128 <int>[,] MatrixB = new Vector128 <int> [length3, length4]; Vector128 <int>[,] Matrix = new Vector128 <int> [length3, length4]; int c = 0; fixed(int *ptr = A) { fixed(int *ptr2 = B) { for (int i = 0; i < length3; i++) { for (int j = 0; j < length4; j++) { var v = Sse41.LoadVector128(ptr + c); var v2 = Sse41.LoadVector128(ptr2 + c); c += 4; MatrixA[i, j] = Sse41.MultiplyLow(v, x); MatrixA[i, j] = Sse41.MultiplyLow(MatrixA[i, j], Vector128.Create(a)); MatrixB[i, j] = Sse41.MultiplyLow(v2, y); Matrix[i, j] = Sse41.Add(MatrixA[i, j], MatrixB[i, j]); } } } } return(Matrix); } }
public static Vector128 <int>[,] MultiplyMatrixSSE(int[,] a, int[,] b) { unsafe { int length = a.GetLength(0); int length2 = a.GetLength(1); int length3 = 0; int length4 = 0; try { length3 = length; length4 = length2 / 4; } catch (Exception e) { Console.WriteLine("Error"); } Vector128 <int>[,] A = new Vector128 <int> [length3, length4]; int c = 0; fixed(int *ptr = a) { fixed(int *ptr2 = b) { for (int i = 0; i < length3; i++) { for (int j = 0; j < length4; j++) { var v = Sse41.LoadVector128(ptr + c); var v2 = Sse41.LoadVector128(ptr2 + c); c += 4; A[i, j] = Sse41.MultiplyLow(v, v2); } } } } return(A); } }
private static unsafe void FillRow3(ushort *previousRow, int length) { ushort *bytes = stackalloc ushort[] { 1, 2, 3, 4, 5, 6, 7, 8 }; var counter = Sse41.LoadVector128(bytes); var step = Vector128.Create((ushort)8); int i = 0; for (; i < (length & 7); i += 8) { Sse42.Store(previousRow + i, counter); counter = Sse42.AddSaturate(counter, step); } //step = Sse42.ShiftRightArithmetic step = Vector128.Create((ushort)1); for (; i < length; ++i) { previousRow[i] = counter.GetElement(0); counter = Sse42.AddSaturate(counter, step); } }
private static unsafe void FillRowSSeVector2(int *previousRow, int length) { const int LENGHT = 4; int i = 0; //int initialCount = Math.Min(count, previousRow.Length); for (i = 0; i < 2 * LENGHT;) { previousRow[i] = ++i; } var counter1 = Sse41.LoadVector128(previousRow); var counter2 = Sse41.LoadVector128(previousRow + LENGHT); var step = Vector128.Create(i); int *pDest = previousRow + i; for (; i < (length - (2 * LENGHT - 1)); i += 2 * LENGHT) { counter1 = Sse42.Add(counter1, step); counter2 = Sse42.Add(counter2, step); Sse42.Store(pDest, counter1); Sse42.Store(pDest + LENGHT, counter2); pDest += 2 * LENGHT; } if (i < (length - (LENGHT - 1))) { counter1 = Sse42.Add(counter1, step); Sse42.Store(previousRow + i, counter1); i += LENGHT; } for (; i < length;) { previousRow[i] = ++i; } }
public unsafe int FastMax(Span <int> span) { int max = span[0]; int i = 0; int vectorSize = 4; if (span.Length >= (vectorSize * 2)) { fixed(int *ptr = &span[0]) { var maxVector = Sse41.LoadVector128(ptr + i); for (i = vectorSize; i < span.Length - vectorSize; i += vectorSize) { var current = Sse41.LoadVector128(ptr + i); maxVector = Sse41.Max(maxVector, current); } Span <int> buffer = stackalloc int[vectorSize]; maxVector.AsVector().CopyTo(buffer); for (int k = 0; k < buffer.Length; k++) { if (buffer[k] > max) { max = buffer[k]; } } } } for (; i < span.Length; i++) { if (span[i] > max) { max = span[i]; } } return(max); }