
私はUbuntu 14.04を搭載したNVIDIAのJetson TK1開発ボードを使用しています。これは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
スケジューラが十分な負荷を検出すると自動的に起動するはずですが、そうではありません(少なくとも私たちのワークロードでは)。回避策は、/sys 内の場所に「1」を書き込むことです。
/sys/devices/system/cpu/cpu1/online
ドキュメントには、以下のコマンドを順番に実行すると書かれています -
sudo su
echo 1 > /sys/devices/system/cpu/cpu1/online
CPU2とCPU3でも繰り返します。これでうまくいきます。
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
アクティブなCPUは1つだけ表示されます。これらの行をターミナルに直接貼り付けても機能しません。私にとっては、それが不可解な部分ではありませんでした。私は何かを間違えたのだと思いました。は不可解です。 先ほど言ったように、コマンドを実行するsudo su
とecho
機能します。ルートから抜けて
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu2/online"
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu3/online"
私のユーザー シェル (ユーザーは sudoer) では、 が機能します。 を実行しないとsudo su
、1 はどの CPU にもエコーされません。ただし、sudo su
1 つの CPU に対して の後にエコーすると、ルート シェルの外部で他の 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
の代わりにを使用する必要があるsudo
のは、sudo はメイン プログラムでのみ動作し、リダイレクト ( >
) はルート権限なしで実行されるためです。
答え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/パフォーマンスあなたもそうすべきですecho 0 > /sys/devices/system/cpu/cpuquiet/tegra_cpuquiet/enable