private int[] RunSimdOperation(int[] vector1, int[] vector2, Action <SimpleMemory> operation) { SimdOperations.ThrowIfVectorsNotEquallyLong(vector1, vector2); var originalElementCount = vector1.Length; vector1 = vector1.PadToMultipleOf(MaxDegreeOfParallelism); vector2 = vector2.PadToMultipleOf(MaxDegreeOfParallelism); var elementCount = vector1.Length; var memory = new SimpleMemory(1 + elementCount * 2); memory.WriteInt32(VectorsElementCountInt32Index, elementCount); for (int i = 0; i < elementCount; i++) { memory.WriteInt32(VectorElementsStartInt32Index + i, vector1[i]); memory.WriteInt32(VectorElementsStartInt32Index + elementCount + i, vector2[i]); } operation(memory); var result = new int[elementCount]; for (int i = 0; i < elementCount; i++) { result[i] = memory.ReadInt32(ResultVectorElementsStartInt32Index + i); } return(result.CutToLength(originalElementCount)); }
private void RunSimdOperation(SimpleMemory memory, SimdOperation operation) { var elementCount = memory.ReadInt32(VectorsElementCountInt32Index); int i = 0; while (i < elementCount) { var vector1 = new int[MaxDegreeOfParallelism]; var vector2 = new int[MaxDegreeOfParallelism]; var resultVector = new int[MaxDegreeOfParallelism]; for (int m = 0; m < MaxDegreeOfParallelism; m++) { vector1[m] = memory.ReadInt32(VectorElementsStartInt32Index + i + m); } for (int m = 0; m < MaxDegreeOfParallelism; m++) { vector2[m] = memory.ReadInt32(VectorElementsStartInt32Index + i + m + elementCount); } switch (operation) { case SimdOperation.Add: resultVector = SimdOperations.AddVectors(vector1, vector2, MaxDegreeOfParallelism); break; case SimdOperation.Subtract: resultVector = SimdOperations.SubtractVectors(vector1, vector2, MaxDegreeOfParallelism); break; case SimdOperation.Multiply: resultVector = SimdOperations.MultiplyVectors(vector1, vector2, MaxDegreeOfParallelism); break; case SimdOperation.Divide: resultVector = SimdOperations.DivideVectors(vector1, vector2, MaxDegreeOfParallelism); break; default: break; } for (int m = 0; m < MaxDegreeOfParallelism; m++) { memory.WriteInt32(ResultVectorElementsStartInt32Index + i + m, resultVector[m]); } i += MaxDegreeOfParallelism; } }