我正在尝试使用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的不可避免的事实。
任何人都有关于如何在这种情况下继续进行的建议,也许是做类似事情的示例项目,或者可能是阅读的好资源?我做出任何错误的假设吗?
答案 0 :(得分:0)
执行10秒操作会阻止您的GPU是正确的。根据我的经验,当您的计算花费很长时间时,您可以从GPU驱动程序中获得疯狂的行为/崩溃,尤其是当您尝试混合UI和DirectX内容时。我建议您继续沿着将计算分成较小线程数的路径,寻找其他途径来优化计算甚至重构代码。