static unsafe int Main(string[] args) { int testResult = Pass; if (Avx.IsSupported) { using (TestTable <float> floatTable = new TestTable <float>(new float[8] { 1, -5, 100, 0, 1, 2, 3, 4 }, new float[4])) { var vf = Avx.BroadcastScalarToVector128((float *)(floatTable.inArrayPtr)); Unsafe.Write(floatTable.outArrayPtr, vf); if (!floatTable.CheckResult((x, y) => BitConverter.SingleToInt32Bits(x) == BitConverter.SingleToInt32Bits(y))) { Console.WriteLine("AVX BroadcastScalarToVector128 failed on float:"); foreach (var item in floatTable.outArray) { Console.Write(item + ", "); } Console.WriteLine(); testResult = Fail; } } } return(testResult); }
public void RunBasicScenario_Load() { TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_Load)); var result = Avx.BroadcastScalarToVector128( (Single *)(_dataTable.inArrayPtr) ); Unsafe.Write(_dataTable.outArrayPtr, result); ValidateResult(_dataTable.inArrayPtr, _dataTable.outArrayPtr); }
public unsafe void Process(MutableByteImage currentPicture, MutableByteImage nextPicture) { float MaxFactor = 1; float[] attackAr = new float[] { Attack, Attack, Attack, Attack }; float[] decayAr = new float[] { Decay, Decay, Decay, Decay }; int length = nextPicture.Data.Length; float *MaxFactorPtr = &MaxFactor; fixed(float *AttackPtr = attackAr) fixed(float *DecayPtr = decayAr) fixed(byte *currentPicPtr = currentPicture.Data) fixed(byte *nextPicPtr = nextPicture.Data) { byte *currentPxPtr = currentPicPtr; byte *nextPxPtr = nextPicPtr; int remainingLength = length % 4; for (int i = 0; i < length; i += 4) { var currentColor = *nextPxPtr; var workingDataColor = *currentPxPtr; var currentColorPtr = nextPxPtr; var workingDataColorPtr = currentPxPtr; var cmpResult = Avx.ConvertToVector128Single( Sse2.CompareGreaterThan( Sse41.ConvertToVector128Int32(currentColorPtr), Sse41.ConvertToVector128Int32(workingDataColorPtr) )); var pixelFactor = Avx.Add( Avx.And(cmpResult, Avx.BroadcastScalarToVector128(AttackPtr)), Avx.AndNot(cmpResult, Avx.BroadcastScalarToVector128(DecayPtr)) ); var result = Avx.Add( Avx.Multiply( Avx.Subtract( Avx.BroadcastScalarToVector128(MaxFactorPtr), pixelFactor), Sse41.ConvertToVector128Single( Sse41.ConvertToVector128Int32(workingDataColorPtr)) ), Avx.Multiply( pixelFactor, Sse41.ConvertToVector128Single( Sse41.ConvertToVector128Int32(currentColorPtr)))); // TODO improve Store *currentPxPtr = (byte)Avx.Extract(result, 0); currentPxPtr++; *currentPxPtr = (byte)Avx.Extract(result, 1); currentPxPtr++; *currentPxPtr = (byte)Avx.Extract(result, 2); currentPxPtr++; *currentPxPtr = (byte)Avx.Extract(result, 3); currentPxPtr++; nextPxPtr += 4; } for (int i = 0; i < remainingLength; i++) { var currentColor = *nextPxPtr; var workingDataColor = *currentPxPtr; var newPixelFactor = workingDataColor < currentColor ? Attack : Decay; var newPixelValue = (byte)((currentColor * newPixelFactor) + (workingDataColor * (1 - newPixelFactor))); *currentPxPtr = newPixelValue; currentPxPtr++; nextPxPtr++; } } }