15

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

我读过这个(由 Ben Voigt在这里写的):

从当前版本开始,.NET 不使用 MMX 或 SSE 或 AVX

(...)

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

.

我想我需要:

  • SSE 支持向量运算(一次乘以 4 个浮点数)

  • 多线程支持(不会与 C# 线程发生冲突的解决方案/库)

有没有我可以使用的库/dll?

编辑:八度的任何替代品?我只需要 2 个操作:除法,乘法。如果我正确理解 Octave 是什么以及它是如何工作的 - 我将需要解析输出......它不能很快......


根据“你试过什么”和“为什么你不想使用简单for”:

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

我不知道我需要多少个学习时期,但我尝试只对乘法运算进行基准测试,我得到了结果:在我的 Intel Core Duo T2500 2.0GHz CPU 上每个时期大约 16 秒。

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

4

4 回答 4

8

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

事实证明,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)进行优化。

于 2013-01-07T16:06:16.603 回答
7

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

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

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

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

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

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

八度与 C# 的接口

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

于 2013-01-04T16:03:54.583 回答
4

我发现了这样的东西:Microsoft Research Accelerator v2

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

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

  • 除了 DX9 GPU 和 CUDA 之外,还可以在 32 位和 64 位的多核 CPU 上执行。
  • 能够在单个加速器实例中的多个设备上执行

不幸的是我不能使用它,它不能免费用于商业用途,我什至不想问他们要花多少钱……对我来说可能太贵了。

于 2013-01-04T17:39:49.360 回答
0

如果您有能力使用 Mono(.NET 的开源替代运行时)运行它,您可以使用 Mono.Simd (http://docs.go-mono.com/index.aspx?link=N:Mono.Simd ),这使得 SIMD 在结构周围可用,但仅在 Mono 中,JIT 将方法调用内联到 SIMD 操作。

于 2013-01-07T16:19:41.720 回答