numpy は、例えば conda で入れて mkl にリンクされているバージョンでは、内部で使える場所では mkl 側でスレッドを(勝手に)使って計算している。そのため、Python レイヤのプログラミングでスレッドを使わなくても利用できる。
環境変数などを明示的に指定しなくても、勝手にマルチスレッドで動いていた(CPU利用率が複数コア使っている感じだった)ので、どの情報を見ればよいのかと調べると、今は threadpool_infoを見れば解る らしい。
from threadpoolctl import threadpool_info
from pprint import pp
import numpy as np
pp(threadpool_info())
[{'filepath': 'C:\\Users\\hotch\\scoop\\apps\\anaconda3\\2020.11\\Library\\bin\\mkl_rt.dll',
'prefix': 'mkl_rt',
'user_api': 'blas',
'internal_api': 'mkl',
'version': '2020.0.2',
'num_threads': 12,
'threading_layer': 'intel'}]
なるほど、mkl_rt では 12 スレッドと。
環境変数で値をセットしてから見ると
import os
os.environ["MKL_NUM_THREADS"] = "4"
[{'filepath': 'C:\\Users\\hotch\\scoop\\apps\\anaconda3\\2020.11\\Library\\bin\\mkl_rt.dll',
'prefix': 'mkl_rt',
'user_api': 'blas',
'internal_api': 'mkl',
'version': '2020.0.2',
'num_threads': 4,
'threading_layer': 'intel'}]
4に抑えられている。