File: PerformanceTests.cs
Web Access
Project: src\test\Microsoft.ML.CpuMath.PerformanceTests\Microsoft.ML.CpuMath.PerformanceTests.csproj (Microsoft.ML.CpuMath.PerformanceTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using Microsoft.ML.Internal.CpuMath;
 
namespace Microsoft.ML.CpuMath.PerformanceTests
{
    public abstract class PerformanceTests
    {
        private const int ExponentMax = 127;
        private const int ExponentMin = 0;
        private const int ExponentRange = ExponentMax / 8;
 
        protected const int IndexLength = 1000003;
        protected const int Length = 1000003;
        protected const int MatrixIndexLength = 1000;
 
        private const int DefaultSeed = 253421;
        protected const float DefaultScale = 1.11f;
        protected int matrixLength = 1000;
        protected virtual int align { get; set; } = 16;
 
        internal AlignedArray testMatrixAligned;
        internal AlignedArray testSrcVectorAligned;
        internal AlignedArray testDstVectorAligned;
 
        protected float[] src;
        protected float[] dst;
        protected float[] original;
        protected float[] src1;
        protected float[] src2;
        protected float[] result;
        protected int[] idx;
        protected int[] matrixIdx;
 
        private int _seed = DefaultSeed;
 
        private float NextFloat(Random rand, int expRange)
        {
            double mantissa = (rand.NextDouble() * 2.0) - 1.0;
            double exponent = Math.Pow(2.0, rand.Next(-expRange + 1, expRange + 1));
            return (float)(mantissa * exponent);
        }
 
        private int GetSeed()
        {
            int seed = DefaultSeed;
            string cpumathSeed = Environment.GetEnvironmentVariable("CPUMATH_SEED");
 
            if (cpumathSeed != null)
            {
                if (!int.TryParse(cpumathSeed, out seed))
                {
                    if (string.Equals(cpumathSeed, "random", StringComparison.OrdinalIgnoreCase))
                    {
                        seed = new Random().Next();
                    }
                    else
                    {
                        seed = DefaultSeed;
                    }
                }
            }
 
            Console.WriteLine("Random seed: " + seed + "; set environment variable CPUMATH_SEED to this value to reproduce results");
            return seed;
        }
 
        [GlobalSetup]
        public void Setup()
        {
            src = new float[Length];
            dst = new float[Length];
            src1 = new float[Length];
            src2 = new float[Length];
            original = new float[Length];
            result = new float[Length];
            idx = new int[IndexLength];
            matrixIdx = new int[MatrixIndexLength];
 
            _seed = GetSeed();
            Random rand = new Random(_seed);
 
            for (int i = 0; i < Length; i++)
            {
                src[i] = NextFloat(rand, ExponentRange);
                dst[i] = NextFloat(rand, ExponentRange);
                original[i] = dst[i];
                result[i] = dst[i];
                src1[i] = NextFloat(rand, ExponentRange);
                src2[i] = NextFloat(rand, ExponentRange);
            }
 
            for (int i = 0; i < IndexLength; i++)
            {
                idx[i] = rand.Next(0, Length);
            }
 
            for (int i = 0; i < MatrixIndexLength; i++)
            {
                matrixIdx[i] = rand.Next(0, 1000);
            }
 
            testMatrixAligned = new AlignedArray(matrixLength * matrixLength, align);
            testMatrixAligned.CopyFrom(src.AsSpan(0, (matrixLength - 1) * (matrixLength - 1)));
 
            testSrcVectorAligned = new AlignedArray(matrixLength, align);
            testSrcVectorAligned.CopyFrom(src1.AsSpan(0, matrixLength - 1)); // odd input
 
            testDstVectorAligned = new AlignedArray(matrixLength, align);
            testDstVectorAligned.CopyFrom(dst.AsSpan(0, matrixLength));
        }
 
        [GlobalCleanup]
        public void GlobalCleanup()
        {
            original.CopyTo(dst, 0);
            original.CopyTo(result, 0);
        }
    }
}