Scala LMS编写线性代数Lib

Man*_*idt 6 scala linear-algebra

我对C++库Eigen印象深刻,它使用表达式模板在矩阵/向量计算中获得巨大的加速.

我想在scala中克隆这个库.据我所知,scalas类型系统不够强大,不能做这样的事情,但应该可以轻量级模块化升级LMS.似乎有几个项目(Delight,virtualization-lms等).在可靠性和性能方面,哪种项目可以用于此类项目?

谢谢

编辑:我刚刚在scala 2.10中遇到过宏.也许这就是我想在这里使用的.

@ OM-NOM-NOM

重要的部分在http://eigen.tuxfamily.org/dox/TopicInsideEigenExample.html中解释

该示例解释了向量加法

u = v + w
Run Code Online (Sandbox Code Playgroud)

在(本机)C++中具有良好的性能,因为为添加创建了一个临时变量,并将此变量分配给u

for(int i = 0; i < size; i++) tmp[i] = v[i] + w[i];
for(int i = 0; i < size; i++) u[i] = tmp[i];
Run Code Online (Sandbox Code Playgroud)

Eigen使用模板元编程(在上面的链接中逐步解释)在编译时将其减少到

for(int i = 0; i < size; i++) u[i] = v[i] + w[i];
Run Code Online (Sandbox Code Playgroud)

这显然更快,不需要额外的变量.

Edm*_*984 1

要正确回答这个问题,您需要问自己额外的问题:

  1. 您真的确定带有模板的 C++ 代码比 Scala 代码性能更好吗?现代基准测试表明 Java 在矩阵求逆方面比 C++ 更快。这主要是由于虚拟机和硬件的改进。

  2. 与处理非托管内存、悬空指针以及由于 C++ 编码而增加的错误和 bug 所增加的成本相比,拥有更快的矩阵工具可以获得多大的业务收益?

  3. 如果问题可以在小规模的 Scala 中得到令人满意的性能解决,并且只有在大规模时差异才变得显着,那么将问题(矩阵/向量乘法)划分为可以在以下位置执行的不同任务是不合理的:平行线?

个人说明:我与 Joshua Bloch 进行了很少的电子邮件讨论,Joshua Bloch 是有史以来最有影响力的 Java 开发人员之一,也是《Effective Java》的作者,他向我介绍了 Brian Goletz(《Java Concurrency in Practice》的作者,在 Java 并发领域非常有影响力)的有趣演示。 Java 世界也是如此):不是你父亲的冯诺依曼机器:现代硬件速成课程


如果您得出结论认为好处是存在的并且非常重要,并且将来您的问题大小不会增长,因此您不需要从多核执行中受益,那么您可能需要留在 C++ 中。在另一种情况下,请查看 Scala 宏,它自 2.10-M3 起可用。

*额外:当使用在 VM 之上运行的语言(例如 Java 或 C#)时,避免使用中间变量实际上没有意义。事实上,正如您所指出的文章正确描述的那样,JVM如何使用JIT将java字节码翻译成汇编程序存在一定的危险。您可以手动运行的许多优化已经由 JVM 应用,如果您采取预防措施声明方法和变量 FINAL,则大多数推理都是无用的。*