【Ubuntu】最大パフォーマンスを出すためのVSyncの無効化
UbuntuのVSync(垂直同期)はデフォルトで有効になっている。
VSync有効でagxViewerを使うと、シミュレーションの更新周期がモニタのリフレッシュレートと同期しキャップされてしまう。
例えば、シミュレーションの目標更新周期500Hz、モニタのリフレッシュレート60Hzとすると、シミュレーションの更新周期は60Hzとなる。
VSyncを無効化して、シミュレーションの更新周期がキャップされないようにする。
設定方法
NVIDIA GPUを搭載している計算機は NVIDIA GPUのVSync無効化 を参照する。
オンボードグラフィックのVSync無効化
一時的な設定
$ export vblank_mode=0
恒久的な設定
$ echo 'export vblank_mode=0' >> ~/.bashrc
NVIDIA GPUのVSync無効化
NVIDIA GPUとそのドライバを利用している場合には、「nvidia-setting」から設定する。 次のコマンドでnvidia-settingを起動する。
$ nvidia-settings
OpenGL Settings の Sync to VBlank を OFF
にする。

実例
VSyncを無効にするとパフォーマンスが向上する実例を示す。
確認環境
CPU: Intel Core i7-9750H CPU @ 2.60GHz
GPU: NVIDIA GeForce GTX 1650 Mobile / Max-Q
モニタのリフレッシュレート: 144Hz
OS: Ubuntu 20.04 LTS
パフォーマンスの確認にはAGX Pythonチュートリアルスクリプト
<AGX_DIR>/data/python/tutorials/tutorial2_python3_agxViewer.agxPy
を利用した。
このスクリプトを使い、VSyncを有効、無効にした場合のシミュレーションの周期と5秒間のシミュレーションにかかった計算時間を調べた。
シミュレーションの更新周期は次のコマンドを実行して確認した。
周期はagxViewer上でキーボードの shift + s
を入力してFrame rateを確認した。
agxViewer tutorial2_python3_agxViewer.agxPy --realTime 0
計算時間は次のコマンドを実行し、プログラム終了時にコンソールに表示される計算時間を確認した。
agxViewer tutorial2_python3_agxViewer.agxPy --realTime 0 --stopAfter 5
更新周期を下図に示す。 VSyncが有効のときは更新周期が約144Hzでモニタのリフレッシュレートと同期していた。 一方でVSyncが無効のとき、更新周期は約1500Hzであった。

計算時間を次に示す。
# VSync: ON
Stepping 300 time steps (5 sec simulated time) took 2.08066 sec
# VSync: OFF
Stepping 300 time steps (5 sec simulated time) took 0.19189 sec
5秒間のシミュレーションをしたとき、計算時間はVSync有効で約2.80秒、無効で約0.19秒であった。 倍速に換算すると、VSyncが無効のときは実時間に対して26倍速かった。
VSync |
計算時間(s) |
倍速 |
---|---|---|
ON |
2.80 |
1.8 |
OFF |
0.19 |
26 |