如何解决是否可以将两个数组作为单个命令相乘以提高代码性能?
给出以下代码:
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;
}
您还可以将其与已经使用的并行性结合起来。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。