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

时间:2019-05-25 04:29:29

标签: c# arrays optimization addition

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

这会遍历图像中的像素,因此即使是大图像也只需要很小的时间。问题是当我对图像进行动画处理时,这变得很重要。

我从一个简单的for循环开始。 并行循环更快。 带有嵌套for循环的并行循环更快。

我仍然觉得应该有一些像记忆复制一样利用低级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]; }
            );

2 个答案:

答案 0 :(得分:1)

  

添加数组似乎是指令集中的东西

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

C#不支持语言,但是某些JIT编译器(Mono.Simd,RyuJIT)具有特殊情况下的支持,可以将对某些库函数的调用转换为SSE指令。

请参见

答案 1 :(得分:0)

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

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