问题标签 [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.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() 方法
问题(更新);
- 我的结论大体上是正确的吗?还是有其他方面需要检查/考虑?
更多信息:
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.
我认为这听起来很糟糕。
c# - 向量弱 SIMD 性能
我正在优化一种算法,并且正在考虑使用 Vector over double 进行乘法和累加操作。最接近的实现显然是 Vector.dot(v1, v2);... 但是,为什么我的代码这么慢?
与非 SIMD 版本相比,SIMD 版本需要大约 70% 的刻度。我正在运行一个 Haswell 架构和恕我直言。应该实施FMA3!(发布版本,首选 x64)。
有任何想法吗?多谢你们!
c# - 为什么 BigInteger ToByteArray 方法有时会生成一个额外的字节?
控制台应用程序:
结果 :
为什么 BigInteger ToByteArray 方法有时会生成这个额外的字节?我在 .Net Framework 的 4.7.2 和 4.5.2 版本上进行了尝试,结果相同。欢迎提供任何线索,您可能需要 System.Numerics 参考来编译此代码。谢谢
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>
吗?
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
系统上已经存在...
我一定是傻...
c# - System.Numerics.Vector在大型数据集上
我正在尝试通过利用System.Numerics对float[]
数组执行 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# 实现仍处于早期阶段。但是,我看不到一个明确的方法可以真正从中受益,特别是考虑到它在扩展到更大的数据集时最有益。
有没有更好的方法来解决这个问题?
.net - 使用 System.Numerics.Quaternion 进行 3D 旋转
这里的任何人都知道如何使用.net(4.6 及更高版本)System.Numerics.Quaternion 旋转vector3?
虽然我的数学很差,但我的理解只限于:四元数是 4d 的“结构”,可以在 3d 中产生平移、缩放和旋转。
所以我有一场比赛,不能得到任何轮换。做看起来很明显的事情:改变四元数的 W 分量。(角度)然后读取向量产生缩放?!?任何人都能够帮助或指出我正确的方向寻求帮助?
我当前的旋转(非四元数)代码(X 轴示例)
[编辑]
q*Quaternion.CreateFromAxisAngle(aVector, 0) / q 是我最好的猜测,但它不会产生旋转。
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 选项,但仍然找不到它(我只从托管数组中获取构造函数)。
我错过了什么?