概要
CPUタイマは,CPUが処理した時間(CPU時間)のことを指している.
複数個のCPUを用いて実行した場合は,それぞれのCPUの実行時間を加算した時間がCPU時間となる.
そのため,CPU時間は実際の経過時間より長くなることがある.
経過時間とCPU時間を用いることで並列処理の効率を評価できるので便利である.
CPUタイマにも測定可能粒度があるので使用する上ではCPUタイマの性能を知っておく必要がある.
そこで,C++のCPUタイマに対してタイマの評価指標である分解能とレイテンシーを測定してみた.
分解能
タイマが測定可能な時間粒度を指す.
レイテンシー
タイマの測定遅延時間を指す.
CPU時間
CPU時間にはシステムCPU時間とユーザCPU時間の二種類ある.
ユーザCPU時間
プログラムの実行でCPUに費やされた時間
システムCPU時間
システムコール(ファイルI/O, ディスクI/O, メモリ管理等)の実行でCPUに費やされた時間
スリープしている時間と入力待ちの時間はCPUを使用していないことになるのでCPU時間としてカウントされない.
CPU使用率
CPU時間と経過時間を用いてCPU使用率を算出する方法(boostのcpu_timer)がある.
CPU使用率=100.000*(\frac{ユーザCPU時間+システムCPU時間}{経過時間})
複数のCPUで並列処理を行っている場合は100%を超えることがある.
測定
C++で提供されているCPUタイマに対して分解能とレイテンシーを測定した.
測定対象のCPUタイマはユーザCPU時間とシステムCPU時間を計測できるCPUタイマに限定する.
ただし,レイテンシーの測定は経過時間系タイマで測定する必要があるのでchronoを使用した.
分解能とレイテンシーの測定方法は参考資料[2]の3章に記載されている方法を参考にした.
使用プログラム
分解能とレイテンシーの測定方法
Windows
WindowsのVisual Studio 2020 communityを用いてGetProcessTimesの性能評価を行った.
GetProcessTimesはboostのcpu_timerの実装で使用されている.
- 開発環境:
- Visual Studio 2022 community
- PCスペック:
- OS:Windows10 Pro(64bit)
- CPU:Intel(R)Core(TM) i9-109000X 3.70Ghz(物理コア数:10, 論理コア数:20)
- メインメモリ:128GB
分解能
分解能は15,625,000ナノ秒でブレることがなく安定していた.
タイマ | 単位 | 分解能 |
---|---|---|
GetProcessTimes(ユーザCPU時間) | 100ナノ秒 | 15,625,000ナノ秒 |
GetProcessTimes(システムCPU時間) | 100ナノ秒 | 15,625,000ナノ秒 |
レイテンシー
タイマ | レイテンシー |
---|---|
GetProcessTimes | 135.918ナノ秒 |
結論
分解能とレイテンシーを考慮するとWindowsのCPUタイマは秒単位なら問題なく使用できるのではないかと考えている.
Mac
MacのXcodeを用いてtimesの性能評価を行った.
timesはboostのcpu_timerの実装で使用されている.
- 開発環境:
- Xcode 13.2.1
- PCスペック:
- OS:macOS Montery(Mac mini(M1 2020))
- CPU:Apple M1
- メインメモリ:16GB
分解能
分解能は1.000マイクロ秒でブレることがなく安定していた.
タイマ | 単位 | 分解能 |
---|---|---|
times(ユーザCPU時間) | マイクロ秒 | 1.000マイクロ秒 |
times(システムCPU時間) | マイクロ秒 | 1.000マイクロ秒 |
レイテンシー
タイマ | レイテンシー |
---|---|
times | 397.201ナノ秒 |
結論
分解能とレイテンシーを考慮すると,MacのCPUタイマはミリ秒単位なら問題なく使用できるではないかと考えている.
レイテンシーがひどくなければマイクロ秒でも問題なく使用できていたかもしれない.
参考資料
- boostjp,https://boostjp.github.io/
- boost github, https://github.com/boostorg
- CPU Timer(boost), https://www.boost.org/doc/libs/1_54_0/libs/timer/doc/cpu_timers.html
- Optimized C++ ―最適化、高速化のためのプログラミングテクニック, Kurt Guntheroth (著), 島 敏博 (監修), 黒川 利明 (翻訳), オライリージャパン, 2017年2月.
- 性能評価プログラム, https://github.com/Ocean00000/CPUTimeEvaluation