gpt4 book ai didi

Scala LMS 编写线性代数库

转载 作者:行者123 更新时间:2023-12-04 16:00:20 34 4
gpt4 key购买 nike

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

我想在 scala 中克隆这个库。据我所知,scalas 类型系统还不够强大,无法做这样的事情,但它应该是可能的轻量级模块化登台 LMS。那里似乎有几个项目(Delight、虚拟化-lms 等)。就可靠性和性能而言,哪种类型的项目适合使用?

谢谢

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

@om-nom-nom

重要部分在 http://eigen.tuxfamily.org/dox/TopicInsideEigenExample.html 中进行了解释。

该示例解释了向量加法

u = v + w

在( native )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];

Eigen 使用模板元编程(在上面的链接中逐步解释)在编译时将其减少到
for(int i = 0; i < size; i++) u[i] = v[i] + w[i];

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

最佳答案

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

  • 您真的确定带有模板的 C++ 代码比 Scala 代码执行得更好吗? Moderns 基准测试表明 Java 在矩阵求逆方面比 C++ 更快。这主要是由于虚拟机和硬件的改进。
  • 与处理非托管内存、悬空指针以及由于 C++ 编码导致的错误和错误增加的成本增加相比,拥有更快的矩阵工具可以获得多大的业务 yield ?
  • 如果问题可以在小规模的 Scala 中以令人满意的性能解决,并且差异只有在大规模时才变得显着,那么将问题(矩阵/向量乘法)划分为可以执行的不同任务是不合理的平行线?

  • Personal note:I had few emails discussions with Joshua Bloch, one of the most influential Java Developers ever and author of Effective Java, and he has pointed me towards an interesting presentation by Brian Goletz (author of Java Concurrency in Practice and very influential in the Java world as well): Not Your Father's Von Neumann Machine: A Crash Course in Modern Hardware



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

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

    关于Scala LMS 编写线性代数库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10435385/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com