Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 测量ARM Cortex-A15的缓存访问时间/周期_C++_Performance_Caching_Cpu Cache_Cortex A - Fatal编程技术网

C++ 测量ARM Cortex-A15的缓存访问时间/周期

C++ 测量ARM Cortex-A15的缓存访问时间/周期,c++,performance,caching,cpu-cache,cortex-a,C++,Performance,Caching,Cpu Cache,Cortex A,所以我测量了访问手臂皮层A15二级缓存的周期。 我通过分配一个字节和 使地址无效 读取PMCCNTR寄存器 使用ldr访问分配字节的内存位置 再次读取PMCCNTR寄存器 从第二个测量值中减去第一个测量值 缓存访问大约有240个周期,非缓存访问大约有350个周期。 我还使用了ISB、DMB和DSB。你觉得这些数字准确吗?我似乎找不到可以与之相比的官方资源。也许你可以给我指出正确的方向。由于测量开销和随机干扰,测量单个访问会受到不准确的影响。您应该测量大量访问的时间,以获得更能反映所需内容的摊

所以我测量了访问手臂皮层A15二级缓存的周期。 我通过分配一个字节和

  • 使地址无效
  • 读取PMCCNTR寄存器
  • 使用ldr访问分配字节的内存位置
  • 再次读取PMCCNTR寄存器
  • 从第二个测量值中减去第一个测量值
缓存访问大约有240个周期,非缓存访问大约有350个周期。
我还使用了ISB、DMB和DSB。你觉得这些数字准确吗?我似乎找不到可以与之相比的官方资源。也许你可以给我指出正确的方向。

由于测量开销和随机干扰,测量单个访问会受到不准确的影响。您应该测量大量访问的时间,以获得更能反映所需内容的摊销延迟。要测量平均访问时间,您还需要确保这些访问不是并行运行的(这将测量吞吐量,而不是延迟),因此添加一些虚假的依赖项,例如将以前访问的字节的内容添加到下一个地址(在将所有这些字节初始化为零之后)


另外,您没有说明如何使地址无效,但我猜您也将地址从L2中抛出,并且实际上只测量了内存延迟

由于测量开销和随机干扰,测量单个访问会受到不准确的影响。您应该测量大量访问的时间,以获得更能反映所需内容的摊销延迟。要测量平均访问时间,您还需要确保这些访问不是并行运行的(这将测量吞吐量,而不是延迟),因此添加一些虚假的依赖项,例如将以前访问的字节的内容添加到下一个地址(在将所有这些字节初始化为零之后)


另外,您没有说明如何使地址无效,但我猜您也将地址从L2中抛出,并且实际上只测量了内存延迟

你不是在用你的方法测量延迟,而是在测量开销

衡量延迟的标准方法是使用指针追踪测试,初始化指针链以便获得相关访问,并控制它们的位置以便它们适合(或不适合)指定大小的缓存。程序的其余部分是相同的,只是没有使任何内容无效

类似的内容(用于说明,未经测试)

//在缓冲区中准备N个指针链
//假设unsigned int与指针大小相同
无符号整数缓冲区[N];
//在这里以简单直接的方式将它们链接起来。
//如果在主存中工作,也可以使用随机序列
对于(i=1;i0;i--){
p=*p;
}
停止=PMCCNTR();

你不是在用你的方法测量延迟,而是在测量开销

衡量延迟的标准方法是使用指针追踪测试,初始化指针链以便获得相关访问,并控制它们的位置以便它们适合(或不适合)指定大小的缓存。程序的其余部分是相同的,只是没有使任何内容无效

类似的内容(用于说明,未经测试)

//在缓冲区中准备N个指针链
//假设unsigned int与指针大小相同
无符号整数缓冲区[N];
//在这里以简单直接的方式将它们链接起来。
//如果在主存中工作,也可以使用随机序列
对于(i=1;i0;i--){
p=*p;
}
停止=PMCCNTR();

对不起,我应该在第一篇文章中说出来。我做了超过10000次迭代,240/350是我计算的平均值。我使用“MCR p15,0,%2,c7,c6,1”(%2=地址)使地址无效。你是对的,它使L1和L2失效,所以我测量内存访问(350)和L1/L2访问(240,这里我不失效)。@MarkusBraun,你是在每次迭代中测量一次时间,还是在所有迭代中测量一次时间?所以你在支付测量开销,而不是摊销。这个开销可能很大——我不确定PMCCNTR是否是串行化的,但是如果我只在10000次迭代中测量一次时间,这不是不那么精确吗?你的意思是我应该:启动计时器,循环1..10000,在循环内:失效&访问,停止计时器,然后将时间除以10000以获得单个访问的周期?但在这10000次迭代中,可能会出现上下文切换、中断。。。这不会影响最终结果吗?在开始时使所有内容无效,然后访问它们(确保访问模式足够分散,以避免相同的缓存线好处以及硬件预取)。10k访问足够短,可能没有ctxt开关/中断-但通常在进行基准测试时,如果可以的话,最好禁用它们。对不起,应该在第一篇文章中这样说。我做了超过10000次迭代,240/350是我计算的平均值。我使用“MCR p15,0,%2,c7,c6,1”(%2=地址)使地址无效。你是对的,它使L1和L2失效,所以我测量内存访问(350)和L1/L2访问(240,这里我不失效)。@MarkusBraun,你是在每次迭代中测量一次时间,还是在所有迭代中测量一次时间?所以你在支付测量开销,而不是摊销。这个开销可能很大——我不确定PMCCNTR是否是串行化的,但是如果我只在10000次迭代中测量一次时间,这不是不那么精确吗?你的意思是我应该:启动计时器,循环1..10000,在循环内:失效&访问,停止计时器,然后将时间除以10000以获得单个访问的周期?但在这10000次迭代中,可能会出现上下文切换、中断。。。这不会影响最终结果吗?在开始时使所有内容无效,然后访问它们(确保访问模式足够分散,以避免相同的缓存线好处以及硬件预取)。10k访问足够短,可能没有ctxt swit
// prepare a chain of N pointers in a buffer
// Assume unsigned int has the same size as a pointer
unsigned int Buffer[N] ;

// chain them, here in a simple direct fashion.  
// You can also use a randomized sequence if you work in main memory
for (i=1; i<N; i++) { Buffer[i] = (unsigned int) &(Buffer[i-1]) ; }

// close the chain
Buffer[0] = (unsigned int) &(Buffer[N-1]) ;

// measure M accesses
Start =  PMCCNTR() ;
p = &(Buffer[0]) ;
for (i=M; i>0; i--) {
  p = *p;
}
Stop = PMCCNTR();