我正在尝试优化速度。我只想将一个数组中的值添加到另一个数组中。
这会遍历图像中的像素,因此即使是大图像也只需要很小的时间。问题是当我对图像进行动画处理时,这变得很重要。
我从一个简单的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]; }
);
答案 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实现。