2012-02-02 171 views
1

我正在检查来自JGF基准测试的java版本稀疏矩阵乘法程序。我在多种CPU频率下运行这个程序。我也为这个程序做了一些简介。我将它归类为一个内存密集型程序,因为缓存局部性很差,并且访问量很大。这种程序以较慢的频率运行的执行时间应该比较快的频率略微下降,因为它会浪费CPU的闲置时间。但是在我的实验中,这个程序的执行时间与CPU频率成正比。为什么是原因?稀疏矩阵乘法执行时间

矩阵(数组)的维数是500000,这个程序在i7-920中运行,它有三层缓存。 有32KB L1数据2KB,每核L1指令,L2每核256KB和L3 8MB共享高速缓存。

我也得到了由PERF执行统计:对“java命令

性能计数器的统计数据。 JGFSparseMatmultBenchSizeC':

83925.084119 task-clock-msecs   #  1.001 CPUs 
     2,045 context-switches   #  0.000 M/sec 
      28 CPU-migrations   #  0.000 M/sec 
     29,687 page-faults    #  0.000 M/sec 
223,130,573,396 cycles     # 2658.688 M/sec (scaled from 66.68%) 
66,679,432,987 instructions    #  0.299 IPC (scaled from 83.33%) 
12,779,607,690 branches     # 152.274 M/sec (scaled from 83.32%) 
    11,389,605 branch-misses   #  0.089 %  (scaled from 83.32%) 
11,056,332,293 cache-references   # 131.740 M/sec (scaled from 83.34%) 
3,847,329,243 cache-misses    #  45.842 M/sec (scaled from 83.35%) 

    83.816412311 seconds time elapsed 
+0

也许缓存足够大,使内存访问不相关。您没有提供有关问题大小和缓存大小的任何信息。 – 2012-02-02 11:33:53

+0

您是如何确定缓存区域不好?一个好的包应该优化缓存的使用。另外,你的数据是什么样的?如果它是非常结构化或重复的,实现可能会检测到这一点,并进一步优化以减少内存访问。 – Iterator 2012-02-03 05:15:29

+0

我通过perf描述了执行统计信息。有大量的缓存未命中,而且这个程序的IPC很低。 – 2012-02-03 06:03:40

回答

0

Integer对象表示接近0值可以由JVM缓存以节省内存 - 也许可能在其中发挥一定的作用。