概要
ArduinoIDEのボードマネージャーを見ていたら簡単にRaspberry Pi Pico(以下Pico)のオーバークロックができそうな感じになっていました。実際に試してみてCPUオーバークロックとその処理速度を計測比較を行ってみます。
オーバークロックの方法
▼ArduinoIDEボード画面▼
PicoはArduinoIDEから使用する前提です。デフォルトは125MHz? 133MHz?のよう。「ツール」のボード設定で簡単にオーバークロックを選択できるようで非常に簡単です。使用しているライブラリはこちら。IDEのボードマネージャーから「Pico」と検索掛けてもすぐに見つかると思います。
速度比較
オーバークロックを変更して、円周率計算で処理速度の比較を行ってみました。
\begin{align} \sum_{i=0}^\infty \left(-1\right)^{n-1}\frac{1}{2n-1}=\frac{1}{1}-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+\frac{1}{9}-\cdots = \frac{\pi}{4}\\\\ \end{align}▲奇数の逆数をとって、和と差を繰り返していくと円周率の1/4に近づいていく公式です。この円周率計算の処理速度を比較してみます。
▼ソース(スケッチ)▼
// 2023/05/03 imo lab. // https://garchiving.com/ uint32_t core0_Timer, core0_dt; double s; void setup() { Serial.begin(115200); pinMode(25, OUTPUT); while (!Serial) { digitalWrite(25, digitalRead(25) == LOW ? 1 : 0); delay(200); } digitalWrite(25, HIGH); delay(1000); Serial.printf("core0:start....\n\n"); } void loop() { core0_Timer = micros(); s = 0; for (uint32_t n = 1; n <= 1000000; n++) { if (n % 2 == 1) s += 1.0 / (2 * n - 1.0); if (n % 2 == 0) s -= 1.0 / (2 * n - 1.0); } s *= 4.0; core0_dt = micros() - core0_Timer; Serial.printf("%+5s%.5f\n", "ans:", s); Serial.printf("time:%7d ms\n\n", core0_dt / 1000); }
▲和と差の繰り返しを100万回行って円周率を計算してます。シリアル通信が開始されるまでプログラム待機、通信開始後に計算が始まります。その時の計算速度を計測。
ちなみにArduinoUnoでこの計算を行うと1分近くかかります。(Unoで動かす場合は少しソースの修正が必要です)
速度比較結果
オーバークロック毎の処理速度です。
CPU【MHz】 | 時間【s】 | 速度比 |
---|---|---|
50 | 10.077 | 37% |
100 | 4.973 | 75% |
120 | 4.135 | 90% |
133 | 3.272 | ー |
150 | 3.301 | 113% |
175 | ー | ー |
200 | 2.470 | 151% |
225 | 2.194 | 170% |
240 | 2.056 | 181% |
250 | 1.973 | 189% |
275 | ー | ー |
300 | ー | ー |
▲円周率計算の速度比較してます。何が原因かわかりませんがいくつかプログラムの走らない周波数がありました。
▼周波数と電流の関係
CPU【MHz】 | 電流【mA】 |
---|---|
50 | 17 |
100 | 22 |
120 | 25 |
133 | 26 |
150 | 29 |
175 | ー |
200 | 34 |
225 | 37 |
240 | 41 |
250 | 41 |
275 | ー |
300 | ー |
▼グラフ▼
▲先ほどの結果をグラフにしただけです。今回のテストソースでは200MHz位からは速度効果は頭打ちする感じです。
背反何があるのかよくわかってませんが手軽にオーバークロックできるので便利です。
コメント
速度比較の記事を拝読しました。
速度比較結果についての記述についてなのですが、CPU[MHz]と時間[s]は単なる反比例の関係にあるようで、頭打ちしているようには見えません。
CPU[MHz] vs 1/時間[s]のグラフを書いてみれば明らかになると思います。
また、測定数値の転記ミスなのかも知れませんが、CPU 133MHzの時の時間、3.272sだけが特異です。
vabeneさん、サイト拝見下さり有難うございます。おっしゃる通り、概ね反比例(漸近線)になるかと思います。
横軸を周期「S」ではなく周波数「Hz(1/s)」で、また縦軸を降順で表現したため紛らわしかったですね。
また頭打ちという表現も悪かったですね。200MHz当たりからは傾きが寝てきてしまうため、周波数増分ほどの速度効果は期待できないとでも表現すればよかったですかね。補足有難うございました。