我有以下功能:voidikj(float(*a)[N],float(*b)[N],float(*c)[N],intn){inti,j,k;floatr;papi_start();for(i=0;i我正在使用PAPI来计算在papi_start()和papi_stop()之间我有多少加载和存储以及结果我有以下内容:加载(使用PAPI_LD_INS):322678164205053128160607725612714815512101189551102480740695020486450848188商店(使用PAPI_SR_INS):3282906465698128524578256419
papi中的PAPI_L1_LDM和perf中的L1-dcache-load-misses有什么区别?我使用了相同的设置,比如thisposthere。所以,结果我得到了爸爸:PAPI_L1_DCM:515很遗憾,此计算机不支持PAPI_L1_DCA。对于perf(仅在用户空间中,因为papi也只测量用户空间而不测量内核空间):调用:perfstat-B-eL1-dcache-load-misses:u,cache-misses:u./perf16,539L1-dcache-load-misses128cache-misses:u16539对于N=1000000似乎更为合理。加载数据未
我使用SSE4.2和AVX2对2个vector之间的点积进行了向量化,如下所示。该代码是使用带有-O2优化标志的GCC4.8.4编译的。正如预期的那样,两者的性能都变得更好(并且AVX2比SSE4.2更快),但是当我使用PAPI分析代码时,我发现未命中的总数(主要是L1和L2)增加了很多:没有矢量化:PAPI_L1_TCM:784,112,091PAPI_L2_TCM:195,315,365PAPI_L3_TCM:79,362使用SSE4.2:PAPI_L1_TCM:1,024,234,171PAPI_L2_TCM:311,541,918PAPI_L3_TCM:68,842使用AVX2
我使用SSE4.2和AVX2对2个vector之间的点积进行了向量化,如下所示。该代码是使用带有-O2优化标志的GCC4.8.4编译的。正如预期的那样,两者的性能都变得更好(并且AVX2比SSE4.2更快),但是当我使用PAPI分析代码时,我发现未命中的总数(主要是L1和L2)增加了很多:没有矢量化:PAPI_L1_TCM:784,112,091PAPI_L2_TCM:195,315,365PAPI_L3_TCM:79,362使用SSE4.2:PAPI_L1_TCM:1,024,234,171PAPI_L2_TCM:311,541,918PAPI_L3_TCM:68,842使用AVX2
我正在开展一个项目,我们必须实现一种理论上证明对缓存友好的算法。简单来说,如果N是输入,B是每次缓存未命中时在缓存和RAM之间传输的元素数,算法将需要O(N/B)访问RAM。我想证明这确实是实践中的行为。为了更好地理解如何测量各种与缓存相关的硬件计数器,我决定使用不同的工具。一种是Perf另一个是PAPI图书馆。不幸的是,我使用这些工具越多,我就越不了解它们到底在做什么。我正在使用Intel(R)Core(TM)i5-3470CPU@3.20GHz,8GBRAM,L1缓存256KB,L2缓存1MB,L3缓存6MB。高速缓存行大小为64字节。我想这一定是blockB的大小。我们看下面的例