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