【问题标题】:Using shaders for long computations without causing lag使用着色器进行长时间计算而不会导致延迟
【发布时间】:2013-06-25 03:04:31
【问题描述】:

我正在尝试将 Compute Shader 与 DirectX 11 一起使用来进行一些简单但昂贵的计算(想想 Mandelbrot 集)。计算结果放置在纹理上并且不重叠。它不是实时的,因为预计需要 1 到 10 秒,但它会在完成后立即显示在 UI 上。

我正在通过 http://directx4wpf.codeplex.com/ 使用 WPF 和 SharpDX。该库有一个带有 RenderScene 函数的 DX11 视图对象,其中调用 DX 渲染函数(包括计算机着色器)并在主线程中运行,据我了解,它被尽可能频繁地调用(将尝试最大化 FPS )。显然,没有办法保留 Computer Shader,因为如果它也使用 GPU,它会阻塞主线程以及 UI 的其余部分,甚至操作系统的其余部分。

问题是,我应该如何执行这些计算而不导致应用程序其余部分的 UI 出现任何延迟

如果这纯粹是在 CPU 上运行,我将只运行一个单独的线程。但是,根据我对 GPU 的基本了解,我目前的印象是 GPU 不太适合调度/上下文切换。因此,即使我在另一个线程上运行计算(在 DX11 中使用延迟渲染),计算仍然会阻塞 GPU,直到它完成。 正确吗?

我试图将计算着色器的工作拆分成更小的部分(大约 8000 个线程)。这是可行的,没有底层几何体,我每次调用计算着色器时都可以添加一个偏移量。这实际上不起作用,因为开销很大。事实上,将工作分成 N 块(通过连续调用计算着色器 N 次)似乎会导致线性减速 N 倍。我不确定这是否是因为上面链接的 WPF 库 SharpDX ,或者只是使用 GPU 的一个不可避免的事实。

任何人对如何在这种情况下进行操作有建议,也许是做类似事情的示例项目,或者可能是阅读的好资源?我有没有做出任何错误的假设?

【问题讨论】:

    标签: wpf directx gpu sharpdx compute-shader


    【解决方案1】:

    执行那 10 秒的操作会阻塞您的 GPU,这是正确的。根据我的经验,当您的计算花费很长时间时,您可能会从 GPU 驱动程序中获得疯狂的行为/崩溃,尤其是当您尝试混合 UI 和 DirectX 内容时。我建议您继续将计算拆分为较小的线程数,并寻找其他途径来优化您的计算甚至重构您的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多