0

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

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

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

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

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

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

4

1 回答 1

0

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

于 2013-06-25T11:16:56.093 回答