GoのプログラムからCPUの数を取得し、出力する下記のコードを実行して、標準出力される値は8だ。
package main
import (
▸-"fmt"
▸-"runtime"
)
func main() {
▸-fmt.Println(runtime.NumCPU())
}
次に、PCのCPUとコア数を確認するために以下のコマンドを実行する
system_profiler SPHardwareDataType
結果は
Hardware Overview:
========= Number of Processors: 1
Total Number of Cores: 4
=========
プロセッサーが1つでコア数が4つ。。。????
そもそもruntime.NumCPU()のレスポンスには何が返ってくるか調べた方が良さそうだ。
runtime.NumCPU()
まず誤解していたのは、この関数のレスポンスはCPUの数ではなく、CPUのコアの数ということだ。
CPUのコアとは、CPUの中にあるCPUのような処理を行う装置である。(詳しくはない)
僕のMac book proに搭載されているCUPのコアの数は4つだ。
一方で、Goのruntimeはコアの数を倍の8だと捉えた。
コンテクストの違いを感じるのでさらにdigってみる。
記事内で、「Go言語のruntime.NumCPU()
はSMTを含めた論理コア数を返しますが、物理コア数を返すAPIはありませんので….」
という記述がある。どうやらSMTがキーワードのようだ。
SMTとは
Simultaneous Multi Threading(同時マルチスレッディング)の略で単一CPUコアで複数スレッドを同時に実行できるプロセッサの機能。
まとめ
つまり、自分のPCの単一のCPUコアは2つのスレッドを同時に実行できる。
Goは実行時に必要なコア(論理コア)数を取得して8という値を返したということだ。