ubuntu 22.04 中的超低延迟

Aze*_*ilA 2 nvidia matlab mesa drivers 22.04

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

有什么方法可以在 ubuntu 22.04 中启用 Nvidia 超低延迟吗?

Mat*_*erg 5

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

内核“低延迟”

当内核构建为低延迟时,它的滴答频率为 1000hz

这意味着内核每秒将抢占进程 1000 次,而不是 100-200 次(或者调用timeBeginPeriod(1)时 Windows 的最大抢占次数为 1000hz)

详细信息在另一篇文章中进行了解释,但基本上可以归结为更频繁地发生上下文切换,这意味着睡眠线程可以更快地唤醒,并且需要尽快处理的事物(例如音频服务器)会更早唤醒。

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

代价是频繁唤醒带来的更高的 CPU 开销,以及可怕的能源效率(顺便说一句,您应该保持 CPU 调速器的性能以获得稳定的读数)

图形“低延迟”

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

垂直同步关闭

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

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

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

垂直同步开启

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

然而,大多数显示器的显示频率为 60hz(除非您购买了 240hz 显示器)。

如果当 VBlank 间隔到来时 GPU 仍在处理一帧,则需要再等待 16.666ms(为了简洁起见,我将截断为 16ms),以便可以显示它。这被称为“丢失”VBlank 间隔,因此会增加延迟。

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

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

三重缓冲会加剧这种情况,这可能会导致整个帧的延迟(16 毫秒!)

NVIDIA 的低延迟选项是技术和技巧的结合(通常针对流行游戏进行调整,这意味着它可能并不总是适用于您的特定应用程序),启用后:

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

这意味着什么

  1. 我没有提到这一点,但对于低延迟的东西来说,Python 是一个糟糕的选择。它是一种解释性语言,具有大量内存分配,会导致大量抖动。这就是为什么音频服务器是用 C 语言编写的(而不仅仅是任何 C 语言,您必须遵守一些规则,例如避免大多数互斥体或谨慎使用它们,不要调用 malloc 等)。这取决于低延迟的程度。严格的 3 毫秒要求与宽松的 20 毫秒要求不同。
  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 毫秒)

最终,低延迟是一个深入的话题,恐怕单个切换可能会也可能不会达到您想要的效果;取决于你的需要。