我的问题是关于Java与编译代码(例如C++/Fortran/汇编语言)在高性能数值应用程序中的表现。其中双精度矩阵乘法,在blas库中通常称为dgemm,能够实现接近100%的CPU峰值性能(以每秒浮点运算次数表示)。有几个因素可以实现这种性能:缓存分块以实现最大内存局部性、循环展开以最小化控制开销、矢量指令(如SSE)、内存预取和确保没有内存别名。我看到了许多使用汇编、C++、Fortran、Atlas、供应商BLAS的基准测试(典型情况是512及以上维度的矩阵)。另一方面,我听说像Java这样的原则字节编译语言/实现可以快速或几乎与机器编译语言一样快。然而,我没有看到明确的基准测试结果表明它是这样的。相反,从我自己的研究来看,字节编译语言要慢得多。您是否有好的Java/C#矩阵乘法基准测试?即时编译器(实际实现,而不是假设)能否生成满足我列出的点的指令?每个CPU都有峰值性能,这取决于处理器每秒可以执行的指令数。例如,现代2 GHz英特尔CPU可以实现每秒8亿个双精度加/乘,从而产生8 gflops的峰值性能。矩阵乘法是能够实现几乎完整性能的算法之一,其主要原因是计算与内存操作的比率更高(N³/N²)。我感兴趣的数字在N>500左右。
关于实现方面:高层次的细节,如阻塞,在源代码级别上完成。低层优化由编译器处理,可能使用有关对齐/别名的编译器提示。字节编译实现也可以使用阻塞方法编写,因此原则上良好实现的源代码细节将非常相似。