【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 SettingsSync to VBlankOFF にする。

../../../_images/ubuntu_nvidia_gpu_vsync_off.png

実例

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であった。

../../../_images/compare_vsync_framerate.png

計算時間を次に示す。

# 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