Ideal Reality

興味の赴くままに

Raspberry Pi PicoでFreeRTOSのSMPを試してみる

Symmetric Multiprocessing (SMP) with FreeRTOS - FreeRTOS

Symmetric Multiprocessing (SMP) with FreeRTOS SMP support in the FreeRTOS Kernel enables one instance of the FreeRTOS kernel to schedule tasks across multiple identical processor cores. The core architectures must be identical and share the same memory. On this page: Getting started Modifying an application to use FreeRTOS SMP functionality SMP specific APIs SMP specific […]

Raspberry Pi Picoで公式にSMPがサポートされているらしいので、試してみます。

できれば以下2つの記事を先に見ておいた方がいいかと。

Raspberry Pi PicoでFreeRTOSを使う

FreeRTOS-SMP-Demos/FreeRTOS/Demo/CORTEX_M0+_RP2040 at main · FreeRTOS/FreeRTOS-SMP-DemosRaspberry Pi...

Raspberry Pi PicoでFreeRTOS+CLI

Raspberry Pi PicoでFreeRTOSを使うFreeRTOS-SMP-Demos/FreeRTOS/Demo/CORTEX_M0+_RP2040 at main · FreeRTOS/F...

Contents
スポンサーリンク

カーネルの用意

カーネルはFreeRTOS-Kernelのsmpブランチを使います。

GitHub - FreeRTOS/FreeRTOS-Kernel at smp

FreeRTOS kernel files only, submoduled into https://github.com/FreeRTOS/FreeRTOS and various other repos. - GitHub - FreeRTOS/FreeRTOS-Kernel at smp

そしてFreeRTOSConfig.hに以下の項目を設定します

/* SMP port only */
#define configNUM_CORES                         2
#define configTICK_CORE                         1
#define configRUN_MULTIPLE_PRIORITIES           1
#define configUSE_CORE_AFFINITY                 1

ここらへんからFreeRTOSConfig.hをもらってきている場合は既に/* SMP port only */があると思うので、そこを書き換えればいいかと。

とりあえずこれだけで準備は完了です。

ベンチマーク

とりあえず2つタスクを作ってそれぞれのCPUに割り当てて、高速に実行できることを確認したかったので、適当に素数を数え上げるコードを書いて処理時間を測ってみました。

GitHub - Hiroki-Kawakami/pico-freertos-example at smp-test

Use FreeRTOS on Raspberry Pi Pico. Contribute to Hiroki-Kawakami/pico-freertos-example development by creating an account on GitHub.

FreeRTOS+CLI

そして実行結果はこんな感じ

cli> prime once 10000
Start 1 task
cli> 
1229 prime numbers found!
Finish! 5100 Tick (Core 0)

cli> prime single 10000
Start 2 task on single core
cli> 
1229 prime numbers found!
Finish! 10160 Tick (Core 0)

1229 prime numbers found!
Finish! 10164 Tick (Core 0)

cli> prime multi 10000
Start 2 task on each core
cli> 
1229 prime numbers found!
Finish! 4427 Tick (Core 0)

1229 prime numbers found!
Finish! 5623 Tick (Core 1)

タスク1つだけ実行した時に対して、タスク2つを両方CPU0で実行したときは処理時間が倍近くかかっている一方、CPU0,1に振り分けた場合は概ねタスク1つだけの時と同じ時間で処理が終わりました。

ただ気になるのが、何回かやってもCore 1の方がCore 0よりも処理が毎回遅かったですね。1.3倍くらい違うのでそれなりです。なんでこうなるか訊かれてもよくわかんないし、紐解くにはFreeRTOSのSMP実装に結構詳しくならなきゃいけなそうなので、僕には無理そう。

それこそ、なんでタスク1個だけの時よりタスク2個の時のCore 0の方が速いんだって疑問とか、RP2040のハードウェア構造とか絡んできそうだし、自分は他の人に説明できるほど詳しくなれる自信がないので、気になる方は自分で調べてください。

スポンサーリンク

コメント

投稿されたコメントはありません

名前

メールアドレス(任意)

コメント

関連する投稿
NO IMAGE

Raspberry Pi PicoでFreeRTOSを使う

Raspberry Pi PicoでFreeRTOS+CLI