是否可以将两个数组作为单个命令相乘以提高代码性能?

问题描述

给出以下代码

    public float[] weights;
    public void Input(Neuron[] neurons)
    {
        float output = 0;

        for (int i = 0; i < neurons.Length; i++)
            output += neurons[i].input * weights[i];
    }

是否可以一次执行所有计算?例如,将是“ neurons [0] .input * weights [0] .value +神经元[1] .input * weights [1] .value ...”

来自这个主题-How to sum up an array of integers in C#,有一种方法可以简化计算,但是我的代码的想法是遍历第一个数组,将每个元素乘以第二个数组中相同索引中的元素并将其添加到总计中。

进行性能分析时,将输出求和的行在I / O上非常繁重,并消耗了我99%的处理能力。堆栈应该为此有足够的内存,我并不担心堆栈溢出,我只是想看看它目前工作得更快(即使牺牲了准确性)。

解决方法

我认为您正在使用C#查找AVX

因此您实际上可以在一个命令中计算多个值。

多数民众赞成在SIMD用于CPU内核。 Take a look at this

以下是网站上的示例:

public static int[] SIMDArrayAddition(int[] lhs,int[] rhs)
{
    var simdLength = Vector<int>.Count;
    var result = new int[lhs.Length];
    var i = 0;
    for (i = 0; i <= lhs.Length - simdLength; i += simdLength)
    {
        var va = new Vector<int>(lhs,i);
        var vb = new Vector<int>(rhs,i);
        (va + vb).CopyTo(result,i);
    }

    for (; i < lhs.Length; ++i)
    {
        result[i] = lhs[i] + rhs[i];
    }

    return result;
}

您还可以将其与已经使用的并行性结合起来。