问题标签 [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 回答
891 浏览

c# - 使用 C# System..Numerics.Vector解包/打包位

我正在测试 .Net C# System.Numerics.Vector 类用于打包和解包位的功能。

我希望 Vector 按位左移/右移功能,但目前不可用,所以我尝试使用如下算术和逻辑方法模拟移位。这是我看到的:

使用 Vector.Multiply() 和 Vector.BitwiseOr() 打包(模拟的按位 SHIFT LEFT 和 OR)比数组/指针代码稍差*。

*<10% 的吞吐量下降 (MB/秒)。

但是使用 Vector.Divide() 和 Vector.BitwiseAnd() 解包(模拟按位 SHIFT RIGHT 和 AND)比数组/指针代码差得多**。

**吞吐量下降 50%

注意:

  • Vector 使用单元进行了测试(这也在评论中提出)。

  • 测试基础是在 65536 个整数的块中打包和解包 100Mn 到 1Bn 个整数。我为每个块随机生成了 int[]。

  • 我还测试了按位 (& | >> <<) 以及算术 (+ - * /) 运算,发现成本没有明显差异。甚至除法也没有那么糟糕,整体与乘法仅下降 10%(评论中提出了除法问题)

  • 我将原始测试代码(用于非向量比较)更改为不安全/指针例程,以在打包(多个整数到一个单词)与解包(一个单词到多个整数)方面创建更多类似的测试)。这使非向量代码的整体差异(打包和解包之间)降低到 <5%。(这反驳了我对下面的编译器和优化的评论)

  • 非优化向量:打包速度是解包速度的 2 倍

  • 优化向量:在打包方面产生了 4 倍的改进(相对于未优化的向量),在解包方面得到了 2 倍的改进

  • 未优化的数组/指针:解包比打包快约 5%

  • 优化的数组/指针:对打包产生了 3 倍的改进(相对于未优化的数组指针),对解包产生了 2.5 倍的改进。总体而言,优化的数组/指针打包比优化的数组/指针解包快 <5%。

  • 优化的数组/指针打包比优化的向量包快约 10%

到目前为止的结论:

  • Vector.Divide() 与普通算术除法相比似乎是一个相对较慢的实现

  • 此外,编译器似乎没有将 Vector.Divide() 代码优化到与 Vector.Multiply() 几乎相同的程度(它支持下面关于优化除法的评论)

  • 数组/指针处理目前在打包数据方面比 Vector 类稍快,在解包方面要快得多

  • System.Numerics 需要 Vector.ShiftLeft() 和 Vector.ShiftRight() 方法

问题(更新);

  • 我的结论大体上是正确的吗?还是有其他方面需要检查/考虑?

更多信息:

0 投票
1 回答
1816 浏览

c# - 在 Unity3D UWP 中使用 System.Numerics.dll

我想在我自己的 DLL 项目中使用 System.Numerics 程序集的某些类,这些类也用于其他一些项目。但是我遇到了针对 UWP Hololens 的 Unity3D 问题。在编辑器中它是开箱即用的,但是当我构建项目时 Unity 抱怨
error CS7069: Reference to type 'Vector3' claims it is defined in 'System.Numerics', but it could not be found

我从Unity\Editor\Data\MonoBleedingEdge\lib\mono\4.7.1-api复制了 System.Numerics.Vector.DLL 。4.7.1 应该是根据这篇Unity 博客文章的版本。我尝试了不同的版本(甚至是 4.5),但它也不起作用。

我自己的 DLL 也使用 4.7.1(一开始尝试了 4.6.1)。现在编辑抱怨说Loading script assembly "Assets/DLLs/System.Numerics.Vectors.dll" failed!。因此我排除了编辑器平台。

接下来我尝试使用 System.Numerics.dll(即不仅仅是向量)。现在结果更奇怪了:
CS0433: The type 'Vector3' exists in both 'System.Numerics.Vectors...System.Numerics.

我自己的 DLL 完全是普通的旧 C#,没什么特别的,没有文件访问权限,......

那么我该怎么做呢?是的,我知道 Unity 中有 Vector3D 类 :) 但我需要构建一个在 Unity 外部使用的 DLL。


更新:

我删除了对 System.Numeric 命名空间类的所有直接调用。现在 UWP 解决方案构建,但有一堆后处理错误: Reference rewriter: Error: type 'System.Numerics.Vector3' doesn't exist in target framework. It is referenced from ARSceneSerialization.dll at ARSceneSerialization.ARKeyFrame.

我认为这听起来很糟糕。

0 投票
1 回答
824 浏览

c# - 向量弱 SIMD 性能

我正在优化一种算法,并且正在考虑使用 Vector over double 进行乘法和累加操作。最接近的实现显然是 Vector.dot(v1, v2);... 但是,为什么我的代码这么慢?

与非 SIMD 版本相比,SIMD 版本需要大约 70% 的刻度。我正在运行一个 Haswell 架构和恕我直言。应该实施FMA3!(发布版本,首选 x64)。

有任何想法吗?多谢你们!

0 投票
0 回答
59 浏览

c# - 为什么 BigInteger ToByteArray 方法有时会生成一个额外的字节?

控制台应用程序:

结果 :

为什么 BigInteger ToByteArray 方法有时会生成这个额外的字节?我在 .Net Framework 的 4.7.2 和 4.5.2 版本上进行了尝试,结果相同。欢迎提供任何线索,您可能需要 System.Numerics 参考来编译此代码。谢谢

0 投票
2 回答
3112 浏览

c# - 如何在 C# 中获取 System.Numerics.Vector 的元素?

我想System.Numerics.Vector<T>在 C# 中访问 a 的元素。我正在关注官方文档:https ://docs.microsoft.com/en-us/dotnet/api/system.numerics.vector-1?view=netcore-2.2

我能够创建具有不同数据类型的不同向量。例如:var test = new Vector<double>(new double[] { 1.0, 2.0, 1.0 });

但是现在我遇到了问题,我无法调用 test.Count; 无法在 type 的实例上调用 Count System.Numerics.Vector<T>

我可以使用 访问单个元素access operator [],但我不知道向量中有多少元素。

根据文件,应该有公共财产:

但我无法调用我的System.Numerics.Vector<T>. 相反,我只能以静态方式调用它,如下所示:

这等于 2。

我也可以打电话:

返回:4和

返回 8.

现在我真的有点困惑,关于如何使用这个静态属性。起初,我认为这个属性会返回存储在向量中的元素数量(如文档中所述)。其次,我认为,这个属性返回内存中向量的大小,但是这个数字从 double 增加到 Int32 到 Int16。

有趣的是,我不能从我创建的实例中调用这个静态属性:

我不能打电话test.Count

你知道如何访问 的元素System.Numerics.Vector<T>吗?

0 投票
1 回答
173 浏览

c# - 使用 .Net System.Numeric 的新向量仅填充向量长度的一半

我正在做一个数字过滤器并使用向量和 SIMD 指令使其更快,但在调试过程中我注意到当创建一个新向量时它只初始化向量中的一半项目,例如在创建一个具有长度的向量时8,只有向量的前 4 项有值,其余为 0,即使用于创建向量的数组有 31 项,都不同于 0。这导致过滤器只使用一半系数和一半的数据。

在此处输入图像描述

相关代码如下。

处理剩余部分之后有一些代码,但它不是向量并且工作正常。

0 投票
1 回答
950 浏览

c# - C# 6,VS2015-3,.Net 4.6,System.Numerics.Vectors 没有向量

我正在将应用程序从 Visual Studio 2013 Net 4.5.1 升级到 Visual Studio 2015 C#6 Net 4.6,并且我想使用System.Numerics.Vectors Vector< T >. 我一直在使用 Vector4 来获得在我的应用程序中运行良好的 SIMD,但我想获得 Vector<T> 支持并充分利用更大的 AVX/AVX2 SIMD 寄存器。

开发系统安装了 Net 4.5、4.51、4.52、4.6、4.61 和 4.62 多目标包和 SDK。项目属性 Target Framework 为 4.6。我也试过4.61。项目引用包括System.Numerics(4.6.81.0) 和System.Numerics.Vectors(4.6.81.0)。

但我在System.Numerics命名空间中得到的只是 BigInteger、Complex、Matrix3x2/4x4、Plane、Quaternion、Vector2/3/4。我没有得到 Vector< T >。

在这个后期阶段(2019 年),我是否仍然应该安装旧的 NuGet 预览包以仍然获得 Vector<T>?Vector< T > 现在还不是当前 .Net 4.6 和 4.61 公开版本的一部分吗?如果我必须使用旧的 NuGet,NuGet 包是否只是 VS 和 JIT 的相关信息,或者这是否意味着我必须分发另一个 DLL,即使System.Numerics.Vectors系统上已经存在...

我一定是傻...

0 投票
1 回答
878 浏览

c# - System.Numerics.Vector在大型数据集上

我正在尝试通过利用System.Numericsfloat[]数组执行 SIMD 操作来提高 .NET Core 库的性能。System.Numerics现在有点时髦,我很难看到它是如何有益的。我知道,为了看到 SIMD 的性能提升,它必须在大量计算中进行摊销,但考虑到它目前的实现方式,我不知道如何实现这一点。

Vector<float>需要 8float个值 - 不多也不少。如果我想对一组小于 8 的值执行 SIMD 操作,我不得不将这些值复制到一个新数组并用零填充剩余部分。如果这组值大于 8,我需要复制这些值,用零填充以确保其长度与 8 的倍数对齐,然后循环它们。长度要求是有道理的,但适应这一点似乎是抵消任何性能提升的好方法。

我编写了一个测试包装类来处理填充和对齐:

这个包装器可以解决问题。计算似乎是正确的,并且Vector<T>不会抱怨元素的输入计数。但是,它比简单的基于范围的 for 循环慢两倍。

这是基准:

结果:

我的处理器 (i7-6700k) 确实支持 SIMD 硬件加速,它在 64 位发布模式下运行,并在 .NET Core 2.2 (Windows 10) 上启用了优化。

我意识到这Array.CopyTo()可能是扼杀性能的很大一部分,但似乎没有简单的方法来同时拥有不明确符合Vector<T>规范的填充/对齐和数据集。

我对 SIMD 比较陌生,而且我知道 C# 实现仍处于早期阶段。但是,我看不到一个明确的方法可以真正从中受益,特别是考虑到它在扩展到更大的数据集时最有益。

有没有更好的方法来解决这个问题?

0 投票
3 回答
1906 浏览

.net - 使用 System.Numerics.Quaternion 进行 3D 旋转

这里的任何人都知道如何使用.net(4.6 及更高版本)System.Numerics.Quaternion 旋转vector3?

虽然我的数学很差,但我的理解只限于:四元数是 4d 的“结构”,可以在 3d 中产生平移、缩放和旋转。

所以我有一场比赛,不能得到任何轮换。做看起来很明显的事情:改变四元数的 W 分量。(角度)然后读取向量产生缩放?!?任何人都能够帮助或指出我正确的方向寻求帮助?

我当前的旋转(非四元数)代码(X 轴示例)

[编辑]

q*Quaternion.CreateFromAxisAngle(aVector, 0) / q 是我最好的猜测,但它不会产生旋转。

0 投票
0 回答
200 浏览

c# - 找不到向量(跨度) 构造函数

我正在尝试使用 c# 中的 SIMD 并尝试从 Span ( var myVector = new Vector<T>(myTSpan);) 中初始化 Vector,如: https ://docs.microsoft.com/en-us/dotnet/api/system.numerics.vector-1 ?redirectedfrom=MSDN&view=netstandard-2.1

我正在使用 Visual Studio 2019,C# 7.3;面向 .NET Framework 4.7.2。我正在使用来自 NuGet 的 System.Numerics 4.0.0.0、System.Numerics.Vectors 4.1.4.0 和 System.Memory 4.0.1.0

我还从 NuGet 下载了 NETStandard.Library 2.0.3 并设置了 PackageReference 选项,但仍然找不到它(我只从托管数组中获取构造函数)。

我错过了什么?