之前被要求測試 Android 4.0 的 Renderscript 是否可以做平行處理,但是隨著工作量的增加,一直把這件事擺在後頭,今天,終於測試完了!最早之前,我想到的是修改 HelloCompute 範例中的 mono.rs 檔案,裡頭的 root 函式是一個工作單位,如果一台裝置是多 CPU 且系統支援平行處理的話,理論上一次會有多個工作單位在進行。因此想說擺一個 static 變數在 root 函式中,每次把數值加一並印出,依此觀察系統運作時,印出的數字是否不連續,如果不連續或有相同時,想要把這當作有平行的依據。今天則想到一個更簡單的妙招,就是在 root 函式中,用一個 loop 讓它不結束,如此一來,在雙核心的 CPU 下,就會看到兩次訊息,單核心就只會看到一個!理由很簡單,因為工作沒做完,就不會分配新的工作。
這在 Pandaboard 上測試很成功,我看到了兩次 root 函式印出的訊息,然而,我更想要驗證自己設計的方式是不是對的,那就必須找只有一個核心的裝置,甚至四核心的裝置測試,如果在一個 CPU 的裝置只看到一次,在四核心的裝置可以看到四次,那代表驗證成功了。結果把構想跟同事分享後,同事教了我一個密技!那就是手動去更改 CPU 的狀態!對 Pandaboard 來說,就是強制把一個 CPU 關掉(offline),慶幸的,驗證對了!
這個用法其實最常看到別人修改機子的 CPU 頻率,例如一台裝置他本身的 CPU 可以跑到 500 MHz,但為了省電、穩定、商業手段等理由,系統廠會降頻跑,例如用 300 MHz 運行等等,這些則可以透過系統設定檔進行操作的,也因此有人刷機改機追求好的效能。
此例只在雙核心的板子上,手動把一顆 CPU 關掉:
$ adb devices
List of devices attached
################ device
$ adb shell ls -R /sys | grep -i cpu
...
/sys/devices/system/cpu:
cpu0
cpu1
cpufreq
cpuidle
...
$ adb shell
root@android:/ # cd /sys/devices/system/cpu
root@android:/sys/devices/system/cpu # ls
cpu0
cpu1
cpufreq
cpuidle
kernel_max
offline
online
possible
present
root@android:/sys/devices/system/cpu # cat online
0-1
root@android:/sys/devices/system/cpu # cat cpu*/online
1
1
root@android:/sys/devices/system/cpu # echo "0" > cpu1/online
root@android:/sys/devices/system/cpu # cat cpu*/online
1
0
root@android:/sys/devices/system/cpu # cat online
0
在 Pandaboard 上,因為是雙核心架構,所以會看到 CPU0 和 CPU1 的資訊,接著分別印出 /sys/devices/system/cpu/cpu0/online 和 /sys/devices/system/cpu/cpu1/online 資訊,標記 1 代表都是運作中,同時印出 /sys/devices/system/cpu/online 會是 0-1 的資訊。接著使用 echo "0" > /sys/devices/system/cpu/cpu1/online ,代表令 CPU1 下線不運作,反之 echo "1" > /sys/devices/system/cpu/cpu1/online 則是讓他醒來運作。透過這個簡單的方式,就能讓控制裝置多核心的狀態啦!真是超方便的,但別忘了執行 adb shell 時,必須有 root 權限才行。
至於 CPU 調頻、穩頻,還沒親手測過,但原理很像,就順便筆記一下:
以 /sys/devices/system/cpu/cpu0 來說,裡頭 cpufreq 目錄,裡面又有 cpuinfo_cur_freq、cpuinfo_max_freq 和 cpuinfo_min_freq 等資訊,不難猜到吧?只要把 scaling_max_freq 跟 scaling_min_freq 設成一樣就是穩頻,把 scaling_max_freq 調高則是超頻吧,有空再來試試!穩頻應該很好用,可以在一樣的 CPU 狀態下收集測試數據。
沒有留言:
張貼留言