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
也许缓存足够大,使内存访问不相关。您没有提供有关问题大小和缓存大小的任何信息。 – 2012-02-02 11:33:53
您是如何确定缓存区域不好?一个好的包应该优化缓存的使用。另外,你的数据是什么样的?如果它是非常结构化或重复的,实现可能会检测到这一点,并进一步优化以减少内存访问。 – Iterator 2012-02-03 05:15:29
我通过perf描述了执行统计信息。有大量的缓存未命中,而且这个程序的IPC很低。 – 2012-02-03 06:03:40