- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
随着 .NET 版本的演进,从 .NET Standard 2.0 版本开始,支持 Vector<T> 类型。 从 .NET 8.0 版本开始,大量在 Runtime 提供的各个组件中运用向量计算,特别是 Linq。 Vector 类型 :表示指定数值类型(适用于并行算法的低级别优化)的单个向量.
假如我们有一个求和函数接受一个int数组入参,当它的长度大于等于8及其倍数以上时,那么我们就可以考虑使用向量Vector<T>加速求和计算.
以下是使用了向量的求和函数代码:
internal class Program
{
static void Main(string[] args)
{
int[] array = Enumerable.Range(1, 32).ToArray();
int result = Sum(array);
Console.WriteLine(result);
Console.ReadKey();
}
public static int Sum(int[] numbers)
{
ReadOnlySpan<int> span = new ReadOnlySpan<int>(numbers);
ref int ptr = ref MemoryMarshal.GetReference(span);
int result = 0;
int vectorSize = Vector<int>.Count;
int index;
int remainder = span.Length % vectorSize;
int vectorLength = span.Length - remainder;
Vector<int> vector = Vector<int>.Zero;
for (index = 0; index < vectorLength; index += vectorSize)
{
//Vector<int> vector2 = new Vector<int>(span.Slice(index, vectorSize));
ref byte address = ref Unsafe.As<int, byte>(ref Unsafe.Add(ref Unsafe.AsRef(in ptr), index));
Vector<int> vector2 = Unsafe.ReadUnaligned<Vector<int>>(ref address);
vector += vector2;
}
result += Vector.Dot<int>(vector, Vector<int>.One);
for (; index < span.Length; index++)
{
result += Unsafe.Add(ref ptr, index);
}
return result;
}
}
以下是相减函数代码:
static int Sub(int[] numbers)
{
ReadOnlySpan<int> span = new ReadOnlySpan<int>(numbers);
ref int ptr = ref MemoryMarshal.GetReference(span);
int result = 0;
int vectorSize = Vector<int>.Count;
int index;
int remainder = span.Length % vectorSize;
int vectorLength = span.Length - remainder;
for (index = 0; index < vectorLength; index += vectorSize)
{
ref byte address = ref Unsafe.As<int, byte>(ref Unsafe.Add(ref Unsafe.AsRef(in ptr), index));
Vector<int> vector = Unsafe.ReadUnaligned<Vector<int>>(ref address);
result -= Vector.Dot<int>(vector, Vector<int>.One);
}
for (; index < span.Length; index++)
{
result -= Unsafe.Add(ref ptr, index);
}
return result + 2;
}
其它运算,例如相减,也是同理。 以上代码,均可以在 .NET Standard 2.0 及以上版本运行.
当我们向量 Vector<T> 之后,特别是在一些频繁调用计算的场景,将获得指数量级的性能提升。 需要注意的是,向量 Vector<T> 依赖 CPU 硬件的 SIMD 指令集支持,在一些相对较旧的 古董CPU,可能不支持.
PS
最后此篇关于【一天一点.NET小知识】运用向量Vector加速求和计算的文章就讲到这里了,如果你想了解更多关于【一天一点.NET小知识】运用向量Vector加速求和计算的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我对这个错误很困惑: Cannot implicitly convert type 'System.Func [c:\Program Files (x86)\Reference Assemblies\
考虑这段代码: pub trait Hello { fn hello(&self); } impl Hello for Any { fn hello(&self) {
问题很简单。是否可以构造这样一个类型 T,对于它下面的两个变量声明会产生不同的结果? T t1 = {}; T t2{}; 我已经研究 cppreference 和标准一个多小时了,我了解以下内容:
Intellij idea 给我这个错误:“Compare (T, T) in Comparator cannot be applied to (T, T)” 对于以下代码: public class
任何人都可以告诉我 : n\t\t\t\t\n\t\t\t 在以下来自和 dwr 服务的响应中的含义和用途是什么. \r\n\t\t\t \r\n\t\t\t
让 T 成为一个 C++ 类。 下面三个指令在行为上有什么区别吗? T a; T a(); T a = T(); T 为不带参数的构造函数提供了显式定义这一事实是否对问题有任何改变? 后续问题:如果
Rust中的智能指针是什么 智能指针(smart pointers)是一类数据结构,是拥有数据所有权和额外功能的指针。是指针的进一步发展 指针(pointer)是一个包含内存地
比如我有一个 vector vector > v={{true,1},{true,2},{false,3},{false,4},{false,5},{true,6},{false,7},{true,8
我有一个来自 .xls 电子表格的数据框,我打印了 print(df.columns.values) 列,输出包含一个名为:Poll Responses\n\t\t\t\t\t。 我查看了 Excel
This question already has answers here: What are good reasons for choosing invariance in an API like
指针类型作为类型前缀与在类型前加斜杠作为后缀有什么区别。斜线到底是什么意思? 最佳答案 语法 T/~ 和 T/& 基本上已被弃用(我什至不确定编译器是否仍然接受它)。在向新向量方案过渡的初始阶段,[T
我正在尝试找到一种方法来获取模板参数的基类。 考虑以下类: template class Foo { public: Foo(){}; ~Foo(){};
这是一个让我感到困惑的小问题。我不知道如何描述它,所以只看下面的代码: struct B { B() {} B(B&) { std::cout ::value #include
为什么有 T::T(T&) 而 T::T(const T&) 更适合 copy ? (大概是用来实现move语义的???) 原始描述(被melpomene证明是错误的): 在C++11中,支持了一种新
在 Java 7 中使用 eclipse 4.2 并尝试实现 List 接口(interface)的以下方法时,我收到了警告。 public T[] toArray(T[] a) { ret
假设有三个函数: def foo[T](a:T, b:T): T = a def test1 = foo(1, "2") def test2 = foo(List(), ListBuffer()) 虽
我对柯里化(Currying)和非柯里化(Currying)泛型函数之间类型检查的差异有点困惑: scala> def x[T](a: T, b: T) = (a == b) x: [T](a: T,
考虑一个类A,我如何编写一个具有与相同行为的模板 A& pretty(A& x) { /* make x pretty */ return x; } A pretty(A&& x) {
Eclipse 表示由于泛型类型橡皮擦,类型参数不允许使用 instanceof 操作。 我同意在运行时不会保留任何类型信息。但是请考虑以下类的通用声明: class SomeClass{ T
在 C++14 中: 对于任何整数或枚举类型 T 以及对于任何表达式 expr: 有没有区别: struct S { T t { expr }; }; 和 struct S { T t = { exp
我是一名优秀的程序员,十分优秀!