有没有更快的方法来添加数组? [关闭]

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 实现。

【讨论】:

以上是关于有没有更快的方法来添加数组? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

有没有更快的方法来分隔两个数组的最小值和最大值?

有没有比使用 np.where 更快的方法来迭代一个非常大的 2D numpy 数组?

哪个更快?常量、变量或变量数组

添加 MYSQL 数组时遇到问题 [关闭]

有没有更快的方法来达到相同的结果? [复制]

如何重写这个嵌套的 SQL 查询以使其更快? [关闭]