问题标签 [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.
c# - c# 使用 system.numerics 将数组元素相乘
我正在尝试使用 System.Numerics 来处理多个数组元素。有没有更快的方法将结果向量 (accVector) 的元素相乘?目前 accVector 需要转换为使用 LINQ 将元素相乘的数组。
c# - 矢量化没有提供预期的加速
我很喜欢 .NET 4.7.2 上的 System.Numerics.Vector。作为第一次尝试,我编写了一个基本函数来识别 ASCII 字符串中是否存在空格。我实现了该功能的三个版本:
- LINQ,
- 经典的 for 循环和
- 矢量化版本(SIMD)。
我很惊讶地看到矢量化版本比经典的 for 循环慢得多。
下面是我对矢量化版本的实现。
难道我做错了什么?在这一点上,我假设经典的 for 循环版本由于 CPU 缓存而更快,但我原以为使用矢量版本我会得到适度的加速。
这是带有基准的完整代码。
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。
给定一个向量,你如何有效地找到一个字符的位置?有没有我不知道的聪明把戏?
c# - 泛型方法的 C# 奇怪的内联行为 - 可能的错误
出于某种奇怪的原因,这个泛型方法不会被内联到另一个方法中,除非另一个方法包含一个循环。什么可以解释这种奇怪的行为?对于非泛型方法,内联在两种情况下都会发生,无论有无循环。
代码:
JIT:(使用 SharpLab 反编译)
要点:
- 奇怪的是,
C.M1()
即使它使生成的 JIT 大小更小,它也不会内联方法调用——我也用不同的方法进行了测试。 - 这种奇怪的行为只有在方法是泛型时才会发生,它总是内联直接的非泛型实现。
- 它与泛型方法中的类型切换有关。如果泛型方法不包含这些类型开关,那么只要方法很短,即使没有属性,它也会在两种情况下(
M1
和)都被内联。M2
AggressiveInlining
- 循环启动了一些启发式方法,导致内联发生。
这个例子提出的问题是:
- 这种行为是故意的还是一个错误?
- 有没有办法保证方法的内联
Less()
,而不在调用者方法中使用奇怪的循环? - 这种行为是否也发生在
System.Numerics.Vector<T>
类中,因为它使用了相同的通用类型开关,这些开关已经被优化掉了?
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] 进行了测量。
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 数据进行解包0
1
- 使用提取元素的方式
GetElement()
——也许有一些ToScalar()
调用可能会在这里发生?
c# - 为什么使用大整数 (System.Numerics) 会导致系统溢出?
我收到此错误:System.OverflowException:“值不是数字。” 我的印象是大整数可以存储任何大小的值(在这种情况下为 500 ^ 500),所以我不明白为什么会这样。
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# 代码的性能,以及是否需要考虑其他因素。谢谢!