1,介绍
本文讨论了各种Tegra CPU和GPU性能主题。Tegra处理器以及整个嵌入式板卡的功耗与Tegra处理器的性能密切相关,因此你通常需要仔细选择哪些部件应该以高性能设置运行(以获得最大速度),哪些应该以低性能设置运行(以降低功耗和热量)或完全禁用。
2,控制CPU性能
注意:Debugfs和 non-upstream sysfs节点不保证在未来的L4T版本中保持不变。
Tegra K1是为移动用途设计的,因此包含了大量的功率降低系统,以控制硬件的各个部分何时应运行得更快、更慢或关闭,基于运行时使用情况。这对大多数用例来说是好的,因为默认设置会给许多密集型项目带来高性能,并为许多轻量级任务带来低功耗。但你可能想要强制某些硬件部件以较低或较高的性能运行,例如运行峰值性能的基准测试或强制降低功耗。自动打开/关闭4个主CPU核心和第5个伴随核心主要是在L4T内核中使用“cpuquiet”完成的,这是一种基于工作负载/策略动态热插拔CPU核心的机制。有许多方法可以在运行时或始终在启动时调整性能和功耗行为(都需要下面提到的root权限)。
作为一个通用指南,CPU性能/功耗的不同选项(从最高功耗到最低功耗排序)是:
- 通过禁用热插拔缩放机制,强制所有4个CPU内核达到最大性能。
- 只用默认设置(它会自动在运行时切换4个主CPU核心和第5个低功耗伴随核心的开关)。
- 将4个主CPU核心的最大时钟速率限制在低速以降低功耗(它仍然会自动切换它们的开关,并在适当时切换到第5个低功耗伴随核心)。
- 根据特定用例的最佳效果,打开一些CPU核心并关闭一些。
- 关闭所有4个主CPU核心,强制所有CPU代码改为在第5个“LP”低功耗影子伴随核心上运行,以实现最大的功耗降低。
2.1,如何临时或在每次启动时以root权限运行命令
本页面上的所有命令都必须以root用户身份执行。要以root权限执行某些命令,只需运行“sudo su”登录为root用户,执行命令,然后运行“exit”返回到普通用户。例如:
sudo su
(enter your password, it is "ubuntu" by default)
# Run a command that requires root privileges
echo Hello > /TEST.txt
exit
要在每次启动时自动执行命令,你可以将你的命令放入“/etc/rc.local”引导脚本中。例如,在你的板上运行以下操作:
sudo nano /etc/rc.local
然后在文件底部但“exit”行之前添加你的自定义命令:
# Disable USB auto-suspend, since it disconnects some devices such as webcams on Jetson TK1.
echo -1 > /sys/module/usbcore/parameters/autosuspend
保存文件后按Ctrl+X,然后按Y再按Enter键,然后重启设备:
sudo reboot
2.2,查看当前CPU状态
你可以检查4个CPU核心中哪些目前正在运行(在线)而不是休眠(离线):
cat /sys/devices/system/cpu/online
例如,它可能会显示“0-2”,表示核心0、1和2目前正在运行。如果你再次运行,它现在可能显示“0”,表示只有核心0在运行,如果没有很多后台任务的话。
要查看当前的CPU时钟频率(注意,对于当前正在休眠的核心,你会看到错误):
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
cat /sys/devices/system/cpu/cpu1/cpufreq/scaling_cur_freq
cat /sys/devices/system/cpu/cpu2/cpufreq/scaling_cur_freq
cat /sys/devices/system/cpu/cpu3/cpufreq/scaling_cur_freq
你还可以看到它是在主4核CPU集群(名为“G”代表通用集群)上运行,还是在第5个低功耗伴随核心(名为“LP”代表低功耗集群)上运行:
cat /sys/kernel/cluster/active
2.3,最大化CPU性能
为了在CPU上获得全性能(例如:用于性能测量或基准测试,或者当你不关心功耗时),你可以禁用CPU缩放并强制4个主CPU核心始终以最大性能运行,直到重启:(使用root权限)
echo 0 > /sys/devices/system/cpu/cpuquiet/tegra_cpuquiet/enable
echo 1 > /sys/devices/system/cpu/cpu0/online
echo 1 > /sys/devices/system/cpu/cpu1/online
echo 1 > /sys/devices/system/cpu/cpu2/online
echo 1 > /sys/devices/system/cpu/cpu3/online
echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
2.4,手动设置CPU频率
通过写入以下内容可以设置CPU频率:(使用root权限)
echo "userspace" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
然后把上面的一个频率写到这里:
echo <frequency> > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
请注意,如果你在LP(低性能)集群上运行,以下频率是可用的:
51000 102000 204000 312000 564000 696000 828000 960000 1092000
如果你在HP(高性能,“G”)集群上运行,以下频率是可用的:
204000 312000 564000 696000 828000 960000 1092000 1122000 1224000 1326000 1428000 1530000 1632000 1734000 1836000 1938000 2014500 2116500 2218500 2320500
(这些频率信息是通过在HP / LP集群上尝试所有频率组合并检查/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq手动提取的。)注意:如果在LP集群上将频率设置为51000,然后切换到HP集群,频率读数仍将为51000。在你再次设置之前,实际频率是不确定的。
2.5,限制主CPU核心以低速运行
你可以将4个主核心(“G”通用集群)在CPU中的最大时钟速率限制在低速,以降低功耗(它仍会在适当时自动切换到第5个“LP”(低功耗)伴随核心)。
要查看可用的CPU频率(以kHz为单位,因此“51000”表示51MHz):
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
51000 102000 204000 312000 564000 696000 828000 960000 1092000 1122000 1224000 1326000 1428000 1530000 1632000 1734000 1836000 1938000 2014500 2116500 2218500 2320500
然后你可以设置每个CPU核心的最小和最大频率。
例如,要将4个主CPU核心的速度限制为仅564MHz,运行此命令(使用root权限):
echo 564000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
echo 564000 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq
echo 564000 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_max_freq
echo 564000 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq
请注意,这只对当时没有休眠的核心有效,因此在设置频率之前,你可能想要打开所有CPU核心(如下所述),然后在完成设置频率后关闭核心1-3。
2.6,打开和关闭一些CPU内核
你可以手动将每个CPU核心设置为在线(1)或离线(0):
echo 1 > /sys/devices/system/cpu/cpu0/online
echo 1 > /sys/devices/system/cpu/cpu1/online
echo 1 > /sys/devices/system/cpu/cpu2/online
echo 1 > /sys/devices/system/cpu/cpu3/online
(在此更改期间忽略任何“无效参数”错误)(注意:你可能想要尝试设置cpuquiet的开启/关闭,例如:“echo 0 > /sys/devices/system/cpu/cpuquiet/tegra_cpuquiet/enable”)
2.7,仅限低功率核心
将CPU限制在低功耗伴随核心可以显著降低峰值功率(例如,如果运行在功率受限的电池组上)。Tegra K1中的第5个伴随核心仍然是一个具有NEON SIMD和32KB L1缓存以及512KB L2私有缓存的1GHz Cortex-A15核心,但显然性能低于4个主核心。要仅使用低功耗核心,运行此命令:(使用root权限)
echo 0 > /sys/devices/system/cpu/cpuquiet/tegra_cpuquiet/enable
echo 0 > /sys/devices/system/cpu/cpu1/online
echo 0 > /sys/devices/system/cpu/cpu2/online
echo 0 > /sys/devices/system/cpu/cpu3/online
echo LP > /sys/kernel/cluster/active
(在此更改期间忽略任何“无效参数”错误)(使用上面的“查看当前CPU状态”部分来查看当前正在使用的集群、核心和频率)。
3,控制GPU性能
要手动控制GPU的时钟频率,首先确定支持的频率(由sysfs以kHz列出):
cat /sys/kernel/debug/clock/gbus/possible_rates
72000 108000 180000 252000 324000 396000 468000 540000 612000 648000 684000 708000 756000 804000 852000 (kHz)
然后设置一个频率(例如最大值852000kHz),以Hz为单位指定:(使用root权限)
echo 852000000 > /sys/kernel/debug/clock/override.gbus/rate
echo 1 > /sys/kernel/debug/clock/override.gbus/state
最后验证频率:
cat /sys/kernel/debug/clock/gbus/rate
852000
gbus sysfs节点控制GPU的核心时钟。要控制GPU的内存时钟,请将gbus替换为emc。
4,保持设置
在JetPack 21.4上,添加了一个新脚本,可能会覆盖引导设置。这个论坛帖子有一个很好的解释: Jetson TK1 CPU scaling governor settings not sticking - Jetson TK1 - NVIDIA Developer Forums
本质上,关闭按需引导脚本如下:
sudo update-rc.d -f ondemand remove
这将阻止你的设置在启动后60秒被覆盖。