public void Simd() { Vector128 <float> broadcastFloat = AvxExtensions.BroadcastScalarToVector128(Constant.ForestersEnglish); Vector128 <int> broadcastInt = AvxExtensions.BroadcastScalarToVector128(1); AssertV.IsTrue(Avx.CompareEqual(broadcastFloat, Vector128.Create(Constant.ForestersEnglish))); AssertV.IsTrue(Avx.CompareEqual(broadcastInt, Vector128.Create(1))); Vector128 <int> index = Vector128.Create(0, 1, 2, 3); Vector128 <int> shuffle1 = Avx.Shuffle(index, Constant.Simd128x4.ShuffleRotateLower1); Vector128 <int> shuffle2 = Avx.Shuffle(index, Constant.Simd128x4.ShuffleRotateLower2); Vector128 <int> shuffle3 = Avx.Shuffle(index, Constant.Simd128x4.ShuffleRotateLower3); AssertV.IsTrue(Avx.CompareEqual(shuffle1, Vector128.Create(1, 2, 3, 0))); AssertV.IsTrue(Avx.CompareEqual(shuffle2, Vector128.Create(2, 3, 0, 1))); AssertV.IsTrue(Avx.CompareEqual(shuffle3, Vector128.Create(3, 0, 1, 2))); Assert.IsTrue(shuffle1.ToScalar() == 1); Assert.IsTrue(shuffle2.ToScalar() == 2); Assert.IsTrue(shuffle3.ToScalar() == 3); }
public static Vector128 <float> GetBrucePsmeAbgrGrowthEffectiveAge(SiteConstants site, float timeStepInYears, Vector128 <float> treeHeight, out Vector128 <float> potentialHeightGrowth) { Vector128 <float> B1 = AvxExtensions.BroadcastScalarToVector128(site.B1); Vector128 <float> B2 = AvxExtensions.BroadcastScalarToVector128(site.B2); Vector128 <float> X2toB2 = AvxExtensions.BroadcastScalarToVector128(site.X2toB2); Vector128 <float> siteIndexFromGround128 = AvxExtensions.BroadcastScalarToVector128(site.SiteIndexFromGround); Vector128 <float> X1 = AvxExtensions.BroadcastScalarToVector128(site.X1); Vector128 <float> XX1 = Avx.Add(Avx.Divide(MathV.Ln(Avx.Divide(treeHeight, siteIndexFromGround128)), B1), X2toB2); Vector128 <float> xx1lessThanZero = Avx.CompareLessThanOrEqual(XX1, Vector128 <float> .Zero); Vector128 <float> growthEffectiveAge = Avx.Subtract(MathV.Pow(XX1, Avx.Reciprocal(B2)), X1); growthEffectiveAge = Avx.BlendVariable(growthEffectiveAge, AvxExtensions.BroadcastScalarToVector128(500.0F), xx1lessThanZero); Vector128 <float> timeStepInYearsPlusX1 = AvxExtensions.BroadcastScalarToVector128(timeStepInYears + site.X1); Vector128 <float> potentialHeightPower = Avx.Multiply(B1, Avx.Subtract(MathV.Pow(Avx.Add(growthEffectiveAge, timeStepInYearsPlusX1), B2), X2toB2)); Vector128 <float> potentialHeight = Avx.Multiply(siteIndexFromGround128, MathV.Exp(potentialHeightPower)); potentialHeightGrowth = Avx.Subtract(potentialHeight, treeHeight); return(growthEffectiveAge); }