问题标签 [system.numerics]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
572 浏览

c# - c# 使用 system.numerics 将数组元素相乘

我正在尝试使用 System.Numerics 来处理多个数组元素。有没有更快的方法将结果向量 (accVector) 的元素相乘?目前 accVector 需要转换为使用 LINQ 将元素相乘的数组。

0 投票
1 回答
240 浏览

c# - 矢量化没有提供预期的加速

我很喜欢 .NET 4.7.2 上的 System.Numerics.Vector。作为第一次尝试,我编写了一个基本函数来识别 ASCII 字符串中是否存在空格。我实现了该功能的三个版本:

  1. LINQ,
  2. 经典的 for 循环和
  3. 矢量化版本(SIMD)。

我很惊讶地看到矢量化版本比经典的 for 循环慢得多。

下面是我对矢量化版本的实现。

难道我做错了什么?在这一点上,我假设经典的 for 循环版本由于 CPU 缓存而更快,但我原以为使用矢量版本我会得到适度的加速。

这是带有基准的完整代码。

0 投票
0 回答
233 浏览

c# - 如何有效地找到 System.Numerics.Vector 中的值索引?

我正在使用 .NET Framework 4.7.2 探索 System.Numerics.Vector(我正在处理的项目无法迁移到 .NET Core 3 并使用新的 Intrinsics 命名空间)。该项目正在处理非常大的 CSV/TSV 文件,我们花费大量时间遍历字符串以查找逗号、引号等,我正在努力加快进程。

到目前为止,我已经能够使用 Vector 来识别字符串是否包含给定字符(使用 EqualsAny 方法)。这很好,但我想更进一步。我想使用 Vector 有效地找到该字符的索引。我不知道怎么。下面是我用来确定字符串是否包含逗号的函数。

我知道我可以使用上面的函数并扫描生成的向量,但这会破坏使用向量的目的。我听说新的 Intrinsics 库可以提供帮助,但我无法将我的项目升级到 .NET Core 3。

给定一个向量,你如何有效地找到一个字符的位置?有没有我不知道的聪明把戏?

0 投票
1 回答
87 浏览

c# - 泛型方法的 C# 奇怪的内联行为 - 可能的错误

出于某种奇怪的原因,这个泛型方法不会被内联到另一个方法中,除非另一个方法包含一个循环。什么可以解释这种奇怪的行为?对于非泛型方法,内联在两种情况下都会发生,无论有无循环。

代码:

JIT:(使用 SharpLab 反编译)

要点:

  • 奇怪的是,C.M1()即使它使生成的 JIT 大小更小,它也不会内联方法调用——我也用不同的方法进行了测试。
  • 这种奇怪的行为只有在方法是泛型时才会发生,它总是内联直接的非泛型实现。
  • 它与泛型方法中的类型切换有关。如果泛型方法不包含这些类型开关,那么只要方法很短,即使没有属性,它也会在两种情况下(M1和)都被内联。M2AggressiveInlining
  • 循环启动了一些启发式方法,导致内联发生。

这个例子提出的问题是:

  • 这种行为是故意的还是一个错误?
  • 有没有办法保证方法的内联Less(),而不在调用者方法中使用奇怪的循环?
  • 这种行为是否也发生在System.Numerics.Vector<T>类中,因为它使用了相同的通用类型开关,这些开关已经被优化掉了?
0 投票
1 回答
373 浏览

c# - System.Numerics.Vector.NET Framework 上的初始化性能

System.Numerics.Vector 为 .NET Core 和 .NET Framework 带来了 SIMD 支持。它适用于 .NET Framework 4.6+ 和 .NET Core。

不幸的是,向量的初始化可能是限制步骤。为了解决这个问题,一些来源建议使用 MemoryMarshal 将源数组转换为向量数组 [1][2]。例如:

在 .NET Core 上运行时,这会显着提高性能:

不幸的是,在.NET Framework上,这种初始化向量的方式会产生相反的效果。它实际上会导致更差的性能:

有没有办法在 .NET Framework 上优化 Vector 的初始化并获得与 .NET Core 相似的性能?已使用此示例应用程序 [1] 进行了测量。

[1] https://github.com/CBGonzalez/SIMDPerformance

[2] https://stackoverflow.com/a/62702334/430935

0 投票
1 回答
91 浏览

c# - System.Numerics.Vector仅部分初始化

我正在尝试初始化一个Vector<int>(与 BepuPhysics 集成,但我认为它是无关紧要的)。

我的系统上的静态属性System.Numerics.Vector<int>.Count等于,8所以我手动初始化了一个 8 元素数组。

这是我的代码:

但只有前半部分vector被初始化为正确的值: 调试器截图

我错过了一些明显的东西吗?提前致谢。

0 投票
3 回答
740 浏览

c# - C# 性能改进中的 SIMD 字符串到无符号整数解析

我已经实现了一种使用 .NET 中可用的 SIMD 内在函数解析长度 <= 8 的无符号整数字符串的方法,如下所示:

可悲的是,与基线的比较uint.Parse()给出了以下相当不起眼的结果:

方法 意思是 错误 标准差
基线 15.157 纳秒 0.0325 纳秒 0.0304 纳秒
ParseSimd 3.269 纳秒 0.0115 纳秒 0.0102 纳秒

上面的代码有哪些可以改进的方法?我特别关注的领域是:

  • SIMD 寄存器移位的方式发生在计算中text.Length
  • ~~ 使用一个包含s 和~~MultiplyAddAdjacent的向量对UTF-16 数据进行解包01
  • 使用提取元素的方式GetElement()——也许有一些ToScalar()调用可能会在这里发生?
0 投票
2 回答
69 浏览

c# - 为什么使用大整数 (System.Numerics) 会导致系统溢出?

我收到此错误:System.OverflowException:“值不是数字。” 我的印象是大整数可以存储任何大小的值(在这种情况下为 500 ^ 500),所以我不明白为什么会这样。

0 投票
1 回答
34 浏览

c# - 在 C# 中使用以下函数的矢量化来提高性能的可能性?

我有一个函数可以估计两个输入数组之间的相关性。

输入由 a 提供dataDict,该类型Dictionary<string, double[]>具有 153 个键,其值为大小为 1500 的双精度数组。

对于每个单独的键,我需要估计它与所有其他键的相关性并将结果存储到double[,]大小为double[dataDict.Count(), dataDict.Count()]

下面的函数准备了两个double[]需要估计相关性的数组。

以下函数(我从这里在互联网上找到)使用“Kendall's”方法查找两个输入数组之间的相关性。

向前推进,需要很长时间来计算所有键的相关性。有没有可能优化性能的方法?

我是 C# 新手,但我已经使用 Python 很长时间了,并且在 Python 中使用“Numpys”和“Pandas”我确信上述操作需要几秒钟的时间来计算。例如,假设我以 pandas 数据框的形式获得上述数据,然后data[[list of columns]].corr('method')将在几秒钟内得出结果。这是因为 pandas 在后台使用了 numpy,这得益于矢量化。我想了解如何从矢量化中受益,以提高上述 C# 代码的性能,以及是否需要考虑其他因素。谢谢!