我需要.NET C#更快的浮点运算(用于大数组的乘法和除法)

本文关键字:数组 除法 用于 浮点运算 NET | 更新日期: 2023-09-27 17:50:37

我需要最快的方法来乘除大数组的数据。

我读过这篇文章(由Ben Voigt撰写(:

从当前版本起,.NET不使用MMX、SSE或AVX

(…(

现代C++编译器不仅允许SIMD的使用,而且可以自动向量化将普通代码转换为SIMD指令

我想我需要:

  • SSE支持矢量运算(用于一次乘以4个浮点(

  • 多线程支持(解决方案/库不会以某种方式与C#线程冲突(

有没有我可以使用的库.dll

编辑:有Octave的替代品吗?我只需要两个运算:除法、乘法。如果我正确理解什么是Octave以及它是如何工作的,我将需要解析输出。。。它不可能很快。。。


根据";你试过什么;以及";为什么您不想使用简单的for〃:

我需要这个来进行神经网络训练。网络(现在(有50多个输入,许多神经元(每个50多个权重(。学习数据包含100.000多行,每行50多个字段。每个神经元输入需要很少(至少5次(乘法运算。

我不知道我需要多少个学习时期,但我尝试只对乘法运算进行基准测试,结果是:在我的英特尔酷睿T2500 2.0GHz CPU上,每个时期大约16秒。

我当然可以买更快的电脑,但新电脑值我几个小时的工作,所以我希望它看起来合乎逻辑。。。

我需要.NET C#更快的浮点运算(用于大数组的乘法和除法)

当我看到这个问题时,我搜索了在C#中使用GOTO BLAS库的方法。GOTO库(以作者的名字命名,而不是邪恶的编程关键字(被广泛认为是最快的基于CPU的线性代数库,因为它们是由一位才华横溢的程序员编写的,他用汇编语言为每个特定的CPU架构(Opteron、Xeon等(调整库

事实证明,Math.NET Numerics可能正是您想要的。

来自MSDN描述:

Math.NET Numerics旨在成为.NET Framework的标准开源数学库。它为科学、工程和日常使用中的数值计算提供了方法和算法。Math.NET Numerics涵盖的功能包括特殊函数、线性代数、概率模型、统计学、随机数、插值和积分变换(FFT(。Math.NET Numerics提供了一个在.NET 4.0、Silverlight 4和Mono上运行的完全托管的实现(但也可以为其他平台编译(。它还提供了一个并行化的托管实现,并支持使用本机BLAS/LAPACK库(GotoBLAS、英特尔MKL和AMD ACML(进行优化。

假设您的向量是巨大的N维数组/向量

如果我使用的是像C#这样的慢速语言,并且想要对巨大的数组进行乘法和除法,并且需要利用所有处理器尽快完成,那么我将拥有与GNU Octave的C#接口。GNU倍频程是一种矢量化语言,因此矩阵乘法使用的资源比嵌套循环少一个数量级。

因此,您可以在GNU Octave中定义一些自定义脚本,比如将两个50维数组相乘,然后让C#调用Octave并将参数传递给它。然后让C#收集结果。

GNU Octave旨在利用书中的每一个技巧,使矩阵计算使用尽可能少的资源,并尽快完成。

http://en.wikibooks.org/wiki/Octave_Programming_Tutorial/Getting_started

有人问过如何将C#与Octave:接口

八度音阶与C#的接口

编辑:除非计算时间超过10分钟,否则做所有这些额外的工作都没有意义,而且减少处理时间非常重要。

我发现了这样的东西:微软研究加速器v2

Accelerator是一个高级数据并行库,它使用并行诸如GPU或多核CPU之类的处理器来加速执行。

有趣的功能(从M$网站粘贴(:

  • 除了DX9 GPU和CUDA之外,在32位和64位的多核CPU上执行
  • 能够在单个Accelerator实例中的多个设备上执行

不幸的是,我不能使用它,它不免费用于商业用途,我甚至不想问他们它的价格。。。,可能对我来说太贵了。

如果你能负担得起用Mono运行它,Mono是的开源备用运行库。NET,您可以使用Mono。Simd(http://docs.go-mono.com/index.aspx?link=N:Mono.Simd),这使得SIMD在结构中可用,但仅在Mono中可用,其中JIT内联对SIMD操作的方法调用。