我的问题是关于 Java 与编译代码的性能,例如,高性能数值应用程序中的 C++/fortran/assembly。 我知道这是一个有争议的话题,但我正在寻找具体的答案/例子。还有社区维基。我以前也问过类似的问题,但我认为我说得很笼统,并没有得到我想要的答案。
double 矩阵-矩阵乘法,在 blas 库中通常称为 dgemm,能够实现近 100% 的峰值 CPU 性能(以每秒浮点运算数计)。
有几个因素可以实现这种性能:
缓存阻塞,实现最大内存局部性
循环展开以最小化控制开销
vector 指令,如SSE
内存预取
保证没有内存别名
我见过很多使用汇编、C++、Fortran、Atlas、供应商 BLAS 的基准测试(典型情况是维度为 512 及以上的矩阵)。 另一方面,我听说主要的字节编译语言/实现(例如 Java)可以快或几乎与机器编译语言一样快。但是,我还没有看到明确的基准表明确实如此。相反,(根据我自己的研究)字节编译语言似乎要慢得多。
你有 Java/C# 的良好矩阵-矩阵乘法基准吗? 即时编译器(实际实现,而非假设)是否能够生成满足我列出的要点的指令?
谢谢
关于性能:
每个 CPU 都具有峰值性能,具体取决于处理器每秒可以执行的指令数。例如,现代 2 GHz 英特尔 CPU 可以实现每秒 80 亿 double 加/乘,从而产生 8 gflops 的峰值性能。矩阵-矩阵乘法是一种能够在每秒操作数方面实现几乎全部性能的算法,主要原因是计算与内存操作的比率更高(N^3/N^2)
。我对订单中的某样东西感兴趣的数字 N > 500
。
关于实现:更高级别的细节(例如阻塞)是在源代码级别完成的。低级优化由编译器处理,可能带有关于对齐/别名的编译器提示。字节编译实现也可以使用 block 方法编写,因此原则上体面实现的源代码细节将非常相似。
最佳答案
VC++/.NET 3.5/Mono 2.2在纯矩阵乘法场景下的对比:
Mono 与 Mono.Simd 在缩小与此处手动优化的 C++ 的性能差距方面有很长的路要走,但 C++ 版本显然仍然是最快的。但是 Mono 现在是 2.6 并且可能更接近,我希望如果 .NET 获得像 Mono.Simd 这样的东西,它可能会非常有竞争力,因为 .NET 和顺序 C++ 之间没有太大区别。
关于java - 高性能应用程序中的 C/C++ 与 Java/C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2348967/