Goのruntime.NumCPU()の値が、コア数の倍もある理由

Yu Kato
2 min readSep 1, 2019

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という値を返したということだ。

--

--

Yu Kato

Japanese web developer/1998’s/ i wiill write about my project(Go/React) https://github.com/yutify