Scala LMS编写线性代数Lib



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

我想在 scala 中克隆这个库。据我所知,scalas类型系统不够强大,无法做这样的事情,但它应该是轻量级模块化暂存LMS。似乎有几个项目(Delight,virtualization-lms等(。就可靠性和性能而言,哪种权利用于此类项目?

谢谢

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

@om-nom-nom

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

该示例解释了向量加法

u = v + w

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

for(int i = 0; i < size; i++) tmp[i] = v[i] + w[i];
for(int i = 0; i < size; i++) u[i] = tmp[i];

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

for(int i = 0; i < size; i++) u[i] = v[i] + w[i];

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

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

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

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

  3. 如果问题可以在 Scala 中以令人满意的性能在小范围内解决,并且差异仅在大规模时才变得显着,那么将问题(矩阵/向量乘法(划分为可以并行执行的不同任务不是合理的吗?

个人备注:I与Joshua Bloch几乎没有电子邮件讨论,Joshua Bloch是有史以来最有影响力的Java开发人员之一,也是Effective Java的作者,他向我指出了Brian Goletz(Java Concurrency in Practice的作者,在Java世界中也非常有影响力的(的一个有趣的演讲: 不是你父亲的冯诺依曼机器:速成班 现代硬件


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

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

相关内容

  • 没有找到相关文章

最新更新