内核“低延迟”

内核“低延迟”

我应该用 Matlab 或 Python 运行一个视觉实验项目,其中时间分辨率非常重要!这就是我转向 Linux 并在 ubuntu 中使用低延迟内核的原因。但我认为 Linux Nvidia 设置中存在超低延迟或类似的东西,与 Nvidia 控制面板窗口中的 3D 加速中的东西相同。

有没有什么方法可以在 ubuntu 22.04 中实现 Nvidia 超低延迟?

答案1

您可能不需要该设置,但可能值得详细了解“低延迟”的含义,以了解它如何适应您需要测试的内容:

内核“低延迟”

当内核以低延迟构建时,它会以 1000hz 的频率运行

这意味着内核每秒将抢占进程 1000 次,而不是 100-200 次(或 Windows 的最大 1000hz)。timeBeginPeriod(1)叫做)

详细信息请参阅另一篇帖子但基本上,它归结为上下文切换更频繁地发生,这意味着休眠线程可以更快地唤醒,并且需要尽快处理的事情(例如音频服务器)会被更早唤醒。

它基本上使内核更频繁地检查每个进程“你完成了吗?”。

代价是由于频繁唤醒而导致的更高的 CPU 开销,以及可怕的能源效率(顺便说一句,你应该保持你的 CPU 调速器处于性能稳定读数)

图形“低延迟”

图形中的低延迟被定义为“输入(例如键盘敲击)出现在屏幕上所需的时间”。

垂直同步关闭

当 VSync 关闭时,您已经获得了最低的延迟;因为如果图形在 60hz 显示器上以 300 fps 渲染;它将以 300hz 显示并立即显示,即使显示器仍在显示前一帧,这会导致可见撕裂因为两个或多个帧重叠。

即使 VSync 关闭,其在屏幕上显示的速度也有一个限制,这将受到显示器的像素响应(通常为 5 毫秒)和其他硬件限制的限制。

NVIDIA 设置在这里不重要,因为你已经获得了尽可能低的延迟

垂直同步开启

VSync 等待 VBlank 间隔以交换图像。这意味着您可以在显示器上获得完美的图像。

但是大多数显示器的显示频率为 60hz(除非您购买 240hz 的显示器)。

如果当 VBlank 间隔到来时 GPU 仍在处理某一帧,则它需要再等待 16.666 毫秒(为简洁起见,我将截断为 16 毫秒)才能显示该帧。这被称为“错过”VBlank 间隔,因此增加了延迟。

另一个问题是,如果您的应用程序需要 2ms 来处理并且在 VBlank 之后立即启动,那么现在您需要闲置 14ms 才能将其显示在屏幕上。

当它显示在屏幕上时,所显示的输入至少是在 16 毫秒前或更早之前收集的(假设您的应用程序在 VBlank 之后立即启动,如果它在 VBlank 之后 8 毫秒启动,那么您需要 2 毫秒来处理,6 毫秒空闲,并且输入至少有 8 毫秒或更早)。

三重缓冲会使这种情况更加严重,这可能会增加取决于整帧的延迟(16ms!)

NVIDIA 的低延迟选项是多种技术和技巧的组合(通常针对热门游戏进行调整,这意味着它可能并不总是适用于您的特定应用程序),启用后可实现以下效果:

  1. 双缓冲比三缓冲更受欢迎。我相信此选项已在 NVIDIA 设置中单独提供。
  2. 强制应用程序进入睡眠状态。我们在示例中说您需要 2ms 来处理(我编造了这些数字,这只是一个例子)。如果这是稳定的,理想的情况是在 vblank 之后休眠大约 13ms,收集缓冲的输入(例如键盘、传感器等),在 2ms 内处理所有内容,并且您仍然有 1ms 的空闲时间用于开销和屏幕显示。因此,屏幕上显示的图像显示大约 3ms 前收集的输入,没有撕裂(+5ms 的像素响应,因此可能是 8ms 前)。
    • 棘手的部分是知道何时发生 vblank
    • 更棘手的部分是估计处理输入需要多长时间。它很少是完美的 2ms,并且可能会有噪音和抖动(操作系统分配会毁了你)。如果你估计过高,你将错过下一个 Vblank,并且必须再等待 16ms
    • 有关详细信息,请参阅《使命召唤》中的控制器显示延迟

这意味着什么

  1. 我没有提到这一点,但 Python 对于低延迟的东西来说是一个糟糕的选择。它是一种解释型语言,具有大量内存分配,这会导致大量抖动。这就是为什么音频服务器是用 C 编写的(而不是任何 C,你必须遵守一些规则,例如避免大多数互斥锁或谨慎使用它们,不要调用 malloc 等)。这取决于低延迟的极端程度。严格的 3ms 要求与宽松的 20ms 要求不同。
  2. 您可以在 NVIDIA 设置中关闭三重缓冲。
  3. 如果你不介意撕裂,请关闭垂直同步。这样就大功告成了。
  4. 您可以通过购买 240hz 显示器来解决接下来的所有金钱问题。您已经搞定了。
  5. 如果你担心撕裂问题,又买不起 240hz 的显示器,最好使用 Vulkan(或使用 Vulkan 的引擎并向您展示诸如三重/双倍缓冲区和邮箱显示等设置),这需要更多专业知识,但为您提供了更多工具来了解 VBlank 何时发生以及显示方式(例如 FIFO 与邮箱显示;我不会详细介绍,但您会想要使用邮箱)。您还可以完全控制是否使用双倍或三倍缓冲区。
  6. 进行测量并测试您需要sleep()在给定机器上工作多长时间。一旦您找到最佳点,这可能就“足够好了”。
  7. 理想情况下,使用 DRM 而不是 Xorg 或 Wayland 界面(这是非常先进的)来直接控制屏幕。
  8. 如果您只关心生成报告并在稍后分析/处理数字;并且不需要尽快实时显示在屏幕上;那么整个部分都是浪费时间,因为“NVIDIA 低延迟”设置不会影响您的读数;它仅控制数据显示在屏幕上的时间。

其他杂项

将 CPU 调节器设置为性能以获得稳定的读数。出于同样的原因,禁用 GPU 的节能功能(具体操作方法因供应商/驱动程序而异)。

解决《使命召唤:黑色行动 III》延迟问题是一篇推荐阅读文章,介绍了他们如何设置 GoPro 相机来识别延迟源并修复它;尽管大部分讨论都是针对多人网络延迟(大约为 30-200 毫秒)

最终,低延迟是一个很深奥的话题,我担心一次切换可能会或可能不会实现您想要的效果;这取决于您的需要。

相关内容