我需要.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秒。
我当然可以买更快的电脑,但新电脑值我几个小时的工作,所以我希望它看起来合乎逻辑。。。
当我看到这个问题时,我搜索了在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操作的方法调用。