有没有更快的方法来添加数组? [关闭]
Posted
技术标签:
【中文标题】有没有更快的方法来添加数组? [关闭]【英文标题】:Is there a faster way to add arrays? [closed] 【发布时间】:2019-05-25 04:29:29 【问题描述】:我正在尝试优化速度。我只想将一个数组中的值添加到另一个数组中。
这是迭代图像中的像素,因此即使是大图像也只需要很少的时间。问题是当我为图像设置动画时,这变得很重要。
我从一个简单的 for 循环开始。 并行循环更快。 带有嵌套 for 循环的并行循环更快。
我仍然觉得应该有一些东西可以像 memcopy 那样利用低级 CPU 指令。添加数组似乎是指令集中的东西。
下面的代码是我的ATM。
Parallel.For(0, size.Width, (i) =>
int from = i * size.Height;
int to = from + size.Height;
for (int j = from; j < to; j++) data[j] += map.Data[j];
);
【问题讨论】:
【参考方案1】:添加数组似乎是指令集中的东西
它通常称为 SIMD,对于 x86/x64,它是 SSE(对于 ARM,您有 NEON,对于 PowerPC、AltiVec 等等)。
C# 不支持语言,但一些 JIT 编译器(Mono.Simd、RyuJIT)具有特殊情况支持,可以将对某些库函数的调用转换为 SSE 指令。
见
First support in Mono Modern support in Mono First support in .NET Framework Current support in .NET Framework【讨论】:
【参考方案2】:C# 在 System.Numerics 中支持 SIMD/SSE CPU 指令。加法是一种受益于 SIMD/SSE 指令和多核的操作,直到系统内存带宽的限制。看一个类似的***问题 Why might this SIMD array-adding sample not be demonstrating any performance gains over a naive implementation?
另一个资源是我维护的 nuget.org 上的 HPCsharp nuget 包,请看一下 AddToSse() 的 AddParallel.cs 实现。
【讨论】:
以上是关于有没有更快的方法来添加数组? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章