2021年4月3日 (土曜日)

12:08:43 # Life raspberry pi 3でシンプルなfor loopでの負荷をかけてみた。 全コアで動かしてみるとかならずコア0番が一番遅いっぽい。 /proc/interruptsをながめるとコア0番が割り込みを全部うけているのかな。こういうのはどういう仕組みなんだったろうか。

$ cat /proc/interrupts
          CPU0       CPU1       CPU2       CPU3
 17:   21502192          0          0          0  ARMCTRL-level   1 Edge      3f00b880.mailbox
 18:         48          0          0          0  ARMCTRL-level   2 Edge      VCHIQ doorbell
 40:          0          0          0          0  ARMCTRL-level  48 Edge      bcm2708_fb DMA
 42:     137359          0          0          0  ARMCTRL-level  50 Edge      DMA IRQ
 44:    2287903          0          0          0  ARMCTRL-level  52 Edge      DMA IRQ
 56: 2222544811          0          0          0  ARMCTRL-level  64 Edge      dwc_otg, dwc_otg_pcd, dwc_otg_hcd:usb1
 77:    1443662          0          0          0  ARMCTRL-level  85 Edge      3f804000.i2c
 80:    2079078          0          0          0  ARMCTRL-level  88 Edge      mmc0
 81:       4207          0          0          0  ARMCTRL-level  89 Edge      uart-pl011
 86:   46804443          0          0          0  ARMCTRL-level  94 Edge      mmc1
161:          0          0          0          0  bcm2836-timer   0 Edge      arch_timer
162:   55166228   78210063   47503666   78307132  bcm2836-timer   1 Edge      arch_timer
165:          0          0          0          0  bcm2836-pmu   9 Edge      arm-pmu
FIQ:              usb_fiq
IPI0:          0          0          0          0  CPU wakeup interrupts
IPI1:          0          0          0          0  Timer broadcast interrupts
IPI2:   22952464   86791620   61433702   87885218  Rescheduling interrupts
IPI3:     637958     908167     856293    1170053  Function call interrupts
IPI4:          0          0          0          0  CPU stop interrupts
IPI5:    6303231   14041324    2841915   12741199  IRQ work interrupts
IPI6:          0          0          0          0  completion interrupts
Err:          0

	

16:23:57 # Life 現在のコアを取得するというgetcpu. なんかgetcpu(2)とgetcpu(3)とsched_getcpu(3)がありそれぞれ微妙にインタフェースが違う。 全部読んでみてから結論としては多分sched_getcpuを使うべきな気がする。 sched_getcpuはintで0から順番にCPU番号が返ってきて、get_nprocs_confの数と一致しているように見える。 そしてsched_setaffinityのSET_CPUで設定する値と一致しているように見える。 CPUがonlineとconfの違いを毎回忘れるので調べることになるんだけどどっちだ。

Junichi Uekawa