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の違いを毎回忘れるので調べることになるんだけどどっちだ。