有没有更快的方法来添加数组?
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() 的实现。
我正在尝试优化速度。我只想将一个数组中的值添加到另一个数组中。
这是对图像中的像素进行迭代,因此即使对于大图像也只需要很短的时间。问题是当我为图像制作动画时,这变得很重要。
我从一个简单的 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() 的实现。