GCPにおけるvCPUはハイパースレッディングが有効なので実際のコア数は半分という話

はじめに

会社で,GCPとかAWSは仮想環境だし,ハードウェア環境が良くわからないからHPCの評価に使いたくないんだよねーみたいな話をしていたとき, そういえばこの話ってどこにも書いてないなと思ったので,常識なのかもしれないけど書いておく.

冒頭でネタバレをするとGCPではハイパースレッディングが有効なので,指定したコア数は物理コアとしては半分になる.

GCPやAWSでは仮想マシンを立てるとき,仮想CPU数(vCPU)を設定できる.

ただ,近年の殆どのマシンにはハイパースレッディング・テクノロジーというのが入っているので, 仮想CPUと言われたときに物理コアが何コアぶんなのかという疑問がある. 当然ではあるが,これは仮想マシンなので/proc/cpuinfoなどからは確認できないし,TOPコマンドなどでも確認できない.

DGEMMのプログラムのスレッド数を変化させて回した時,スレッド数に対してどのくらいスケールするのかを確認したので書いておく.

ちなみに私はGCPがメインなので,AWSでも同じかどうかはわからない.

Test bed

Ubuntu20.04でaptで落ちてくるOpenBLASに含まれるDGEMMを実行する.

マシン設定は以下の通りで,32 vCPUで120GBのメモリを搭載した.

spec

実験

N=M=K=5000の行列に対するOpenBLASのDGEMMを10回実行した平均時間を測った.

あんまり関係ないと思うけど,呼び出す側のプログラムをコンパイルしたのはgcc 9.3.0で-O3をつけた.

OMP_NUM_THREADSを変更してスレッド数を変化させた結果を以下に示す.

32T

縦軸が性能で,横軸がスレッド数である.

見ての通りスレッド数が16以上になると性能が低下する.

これは行列をスレッドに対して均等分割しているため,17スレッドでは特定の物理コアが2倍の計算をさせられているためである.

このことから,GCPではハイパースレッディングが有効なため,実際に使える物理コア数は指定された数の半分ということがわかる.

では1coreと2coreの違いは??

こうなると1コアとはなんなのか?

GCPの1コアマシンと2コアマシンを作って同じことをやってみた結果を以下に示す.

  GCP 1core GCP 2core
1thread 38.695 38.864
2threads none 38.917

見ての通り2コアのマシンの1スレッドと2スレッドの性能は変わらない.

また,1コアのマシンと2コアのマシンの性能も変わらない.

もしかすると1コアのマシンには専有できずに2人のユーザが詰め込まれるのかもしれないが, 1時間くらい回し続けたがそういう兆候は見えなかった.

とはいえ,奇数コアにするときは物理コアを専有できないという意味になるのだと考えられるので,注意が必要だと思われる.