
我使用的是 NVIDIA 的 Jetson TK1 開發板,上面有 Ubuntu 14.04。它是一個 4 核心 ARM 系統,預設情況下,其中 3 個是「離線」的 -
ubuntu@tegra-ubuntu ~ $ lscpu
Architecture: armv7l
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0
Off-line CPU(s) list: 1-3
Thread(s) per core: 1
Core(s) per socket: 3
Socket(s): 1
雖然它們應該在調度程序檢測到足夠的負載時自動喚醒,但它們卻沒有(至少對於我們的工作負載而言)。解決方法是將“1”寫入 /sys 內的位置 -
/sys/devices/system/cpu/cpu1/online
文檔說要遵循這些命令,按順序 -
sudo su
echo 1 > /sys/devices/system/cpu/cpu1/online
對 cpu 2 和 3 重複此操作。
ubuntu@tegra-ubuntu ~ $ sudo su
[sudo] password for ubuntu:
root@tegra-ubuntu:/home/ubuntu# echo 1 > /sys/devices/system/cpu/cpu1/online
root@tegra-ubuntu:/home/ubuntu# lscpu
Architecture: armv7l
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0,1
Off-line CPU(s) list: 2,3
Thread(s) per core: 1
Core(s) per socket: 3
Socket(s): 1
root@tegra-ubuntu:/home/ubuntu#
我個人不想使用sudo su
,因為它會傷害我的眼睛,但主要是因為我們需要一個可以喚醒所有 CPU 的腳本,然後執行命令來啟動我們的工作負載。理想情況下,我會把它放在/etc/rc.local
.那是行不通的。啟動時執行 rc.local 後,核心可能會關閉 CPU 電源嗎?
無論如何,這是我的腳本 -
#!/bin/bash
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu1/online"
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu2/online"
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu3/online"
<some command>
問題是,<some command>
上面的運行和回顯行不會在標準輸出上給出任何內容。但是,lscpu
僅顯示 1 個 CPU 處於活動狀態。將這些行直接貼到終端中不起作用。這對我來說並不是令人困惑的部分。我以為我搞砸了一些事情。這是什麼是令人費解。正如我之前所說,執行命令sudo su
後可以正常工作。echo
現在,退出 root 並運行
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu2/online"
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu3/online"
在我的用戶 shell(用戶是 sudoer)中有效。因此,如果我不這樣做sudo su
,任何 CPU 都不會回顯 1。但對一個 CPU 進行回顯sudo su
可以讓我在 root shell 之外回顯其他 CPU。
最後,tee
像這樣使用也不起作用 -
echo 1 | sudo tee /sys/devices/system/cpu/cpu1/online
任何關於為什麼會發生這種情況以及我如何sudo bash -c
在用戶終端的腳本中使用的幫助將不勝感激。
答案1
sudo echo 1 > /sys/devices/system/cpu/cpu0/online
不起作用的原因是該sudo
部分僅適用於主命令(echo 1
);它不適用於重定向 ( > /sys/devices/system/cpu/cpu0/online
),因此寫入檔案部分是在您的使用者帳戶下完成的。
使用類似的東西echo 1 | sudo tee /sys/devices/system/cpu/cpu0/online
應該可行,因為寫作部分將在 下完成sudo
,而該echo
部分將在您的帳戶下完成。我不確定為什麼它在你的情況下不起作用。
答案2
將其放在su
腳本的頂部,然後正常運行命令就可以了。您必須使用sudo su
而不是 just 的原因sudo
是因為 sudo 僅適用於主程序,重定向 ( >
) 是在沒有 root 權限的情況下執行的。
答案3
呵呵。這很奇怪。
這應該有效:
cat | sudo bash << "EOF"
echo 1 > /sys/devices/system/cpu/cpu1/online
echo 1 > /sys/devices/system/cpu/cpu2/online
echo 1 > /sys/devices/system/cpu/cpu3/online
EOF
也許其他東西對你有用,但是因為你沒有禁用縮放調節器,它在你開始使用它們之前關閉了核心?
根據http://elinux.org/Jetson/Performance你也應該echo 0 > /sys/devices/system/cpu/cpuquiet/tegra_cpuquiet/enable