6

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

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

谢谢

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

@om-nom-nom

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

该示例解释了向量加法

u = v + w

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

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

4

1 回答 1

1

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

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

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

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

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


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

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

于 2012-05-23T15:37:58.017 回答