使用Vector从2个数组中添加整数 比传统的for循环需要更长的时间

问题描述 投票:0回答:1

[我正在尝试使用Vector来比传统的for循环更快地从2个数组中添加整数值。

[我的向量计数为:4,这意味着addArrays_Vector函数应比:addArrays_Normally运行大约快4倍

var vectSize = Vector<int>.Count;

然而奇怪的是这些基准:addArrays_Normally takes 475 milliseconds addArrays_Vectortakes 627 milliseconds

这怎么可能? addArrays_Vector不应该只花费大约120毫秒吗?我想知道我做错了吗?

        void runVectorBenchmark()
        {
            var v1 = new int[92564080];
            var v2 = new int[92564080];
            for (int i = 0; i < v1.Length; i++)
            {
                v1[i] = 2;
                v2[i] = 2;
            }
            
            //new Thread(() => addArrays_Normally(v1, v2)).Start();
            new Thread(() => addArrays_Vector(v1, v2, Vector<int>.Count)).Start();
        }
        void addArrays_Normally(int[] v1, int[] v2)
        {
            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();
            int sum = 0;
            int i = 0;
            for (i = 0; i < v1.Length; i++)
            {
                sum = v1[i] + v2[i];
            }
            stopWatch.Stop();
            MessageBox.Show("stopWatch: " + stopWatch.ElapsedMilliseconds.ToString() + " milliseconds\n\n" );
        }
        void addArrays_Vector(int[] v1, int[] v2, int vectSize)
        {
            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();
            int[] retVal = new int[v1.Length];
            int i = 0;
            for (i = 0; i < v1.Length - vectSize; i += vectSize)
            {
                var va = new Vector<int>(v1, i);
                var vb = new Vector<int>(v2, i);
                var vc = va + vb;
                vc.CopyTo(retVal, i);
            }
            stopWatch.Stop();
            MessageBox.Show("stopWatch: " + stopWatch.ElapsedMilliseconds.ToString() + " milliseconds\n\n" );
        }
c# vectorization micro-optimization
1个回答
0
投票

两个功能不同。并且看起来RAM内存是这里的瓶颈:

  • 在第一个示例中

        var v1 = new int[92564080];
        var v2 = new int[92564080];
    
        ...
    
        int sum = 0;
        int i = 0;
        for (i = 0; i < v1.Length; i++)
        {
            sum = v1[i] + v2[i];
        }
    

代码一次读取两个数组。因此,内存消耗为:sizeof(int) *92564080*2==4 * 92564080 * 2== 706 MB

  • 在第二个示例中

        var v1 = new int[92564080];
        var v2 = new int[92564080];
    
        ...            
    
        int[] retVal = new int[v1.Length];
        int i = 0;
        for (i = 0; i < v1.Length - vectSize; i += vectSize)
        {
            var va = new Vector<int>(v1, i);
            var vb = new Vector<int>(v2, i);
            var vc = va + vb;
            vc.CopyTo(retVal, i);
        }
    

代码正在读取2个输入数组并写入一个输出数组。内存消耗至少为sizeof(int) *92564080*3== 1 059 MB

© www.soinside.com 2019 - 2024. All rights reserved.