【发布时间】:2016-07-18 18:15:21
【问题描述】:
我一直在 odroid-xu3 上使用 perf stat 和 cpufreq-set 进行小型实验,这是一个带有 Exynos 芯片(A7 和 A15 ARM 内核的异构处理器)的嵌入式设备。我使用 BLAS lvl3 基准来运行我的实验,并且我一直在使用 taskset 实用程序将任务固定到 A15 核心。我还仔细检查了它是一个单线程实现。
希望在高频或低频运行时周期数应该相同,但我可以看到一个小的变化,例如分别在 400MHz、1000MHz 和 1600MHz 运行 GEMM 内核(矩阵乘法,100 次)我得到结果如下:
7166620830 cycles
17.923790714 seconds time elapsed
7235173436 cycles
7.237463382 seconds time elapsed
7428037080 cycles
4.643897351 seconds time elapsed
您可以看到,即使持续时间与频率也不是真正的线性关系(这至少与测量的周期数一致......)。一个假设是该任务有点内存限制,但我在单精度实现中得到了类似的结果......你知道这可能是什么原因吗?
编辑:矩阵有 400 个样本,我使用环境变量 OPENBLAS_LOOP(openblas 基准测试)运行 100 次。我尽量避免运行其他应用程序,我无法判断负载为 0%,但已经接近。你建议我停止一些特别的事情吗?由于它已经是超过 100 次实验的平均值,因此相同频率的变化非常低(
【问题讨论】:
-
可能需要对该处理器的体系结构有更多了解。这可能有很多原因(内存——有多大的矩阵,有多大的内存和缓存可用,......)。内核或其他运行的应用程序可能存在开销。从这个描述真的很难说。
-
在相同频率的运行之间您看到多少变化?
-
首先,您如何知道您的程序执行是线性的和 100% 确定性的?如果您有一个带有上下文切换的操作系统,这似乎不太可能。如果你有中断,同样的事情。
-
好的,但是线性反对什么?它应该是 100% 确定性的,因为它是 BLAS lvl3 内核,没有数据依赖行为。它只是在处理数据。所以我想如果与频率成线性关系,那么应该是。我当然有上下文切换和中断,但我没想到会有太多开销,因为除了这个之外机器基本上什么都不做。
-
Emilien,您确实计算了 CPU 周期。 CPU 将在计算某些东西时以及当它停止并等待数据(来自缓存,来自内存)时循环。不仅要检查周期,还要检查应该更稳定的指令计数器(如果此性能计数器是为您的 CPU 实现的),还要将内核模式排除在使用
:u后缀:perf stat -e cycles:u,instructions:u,task-clock:u ./program的计数之外。当您对 CPU Freq 进行降频时,您的内存控制器和内存时序可能会发生变化;内存的刷新时间不是从频率计算的,而是从毫秒计算的(比如在 64 毫秒内完全刷新)。
标签: linux embedded perf energy openblas