Kam*_*mil 15 c# math optimization .net-3.5
我需要尽可能快的方法来乘法和划分大数据.
我读过这篇文章(Ben Voigt 在这里写的):
从当前版本开始,.NET不使用MMX或SSE或AVX
(......)
现代C++编译器不仅允许SIMD使用,还可以将普通代码自动矢量化为SIMD指令
.
我想我需要:
向量操作的SSE支持(一次乘以4个浮点数)
多线程支持(不会以某种方式与C#线程冲突的解决方案/库)
我可以使用任何库/ dll吗?
编辑:Octave的任何替代品?我只需要2个操作:分割,乘法.如果我正确理解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,Intel MKL和AMD ACML)进行优化.
假设你的向量是巨大的N维数组/向量
如果我使用的是像C#这样的慢速语言,并且想要使用所有处理器尽可能快地繁殖和划分大型数组,那么我将使用GNU Octave的C#接口.GNU octave是一种矢量化语言,因此矩阵乘法比嵌套for循环使用的资源少一个数量级.
所以你要在GNU Octave中定义一些自定义脚本来说两个50维数组相乘,然后你有C#调用八度音并传递参数.然后让C#收集结果.
GNU Octave旨在利用本书中的每一个技巧,使矩阵计算尽可能少地使用并尽快完成.
http://en.wikibooks.org/wiki/Octave_Programming_Tutorial/Getting_started
有人问过如何使用Octave连接C#:
编辑:除非计算超过10分钟,否则完成所有这些额外工作是没有意义的,减少处理时间非常重要.
| 归档时间: |
|
| 查看次数: |
5012 次 |
| 最近记录: |