有没有更快的方法来添加数组?

Is there a faster way to add arrays?

我正在尝试优化速度。我只想将一个数组中的值添加到另一个数组中。

这是对图像中的像素进行迭代,因此即使对于大图像也只需要很短的时间。问题是当我为图像制作动画时,这变得很重要。

我从一个简单的 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]; }
            );

Adding arrays seems like something that would be in the instruction set

是的,它通常称为 SIMD,对于 x86/x64 它是 SSE(对于 ARM,您有 NEON,对于 PowerPC,AltiVec 等等)。

C# 中没有语言支持,但某些 JIT 编译器(Mono.Simd、RyuJIT)special-cased支持将对某些库函数的调用转换为 SSE 指令。

C# 在 System.Numerics 中支持 SIMD/SSE CPU 指令。加法是一种受益于 SIMD/SSE 指令和多核的操作,可达到系统内存带宽的限制。看看类似的Whosebug问题 Why might this SIMD array-adding sample not be demonstrating any performance gains over a naive implementation?

另一个资源是 nuget.org 上的 HPCsharp nuget 包,我维护它,看看 AddParallel.cs AddToSse() 的实现。