C++ AMP计算和WPF渲染显卡两用性能
Posted
技术标签:
【中文标题】C++ AMP计算和WPF渲染显卡两用性能【英文标题】:C++ AMP calculations and WPF rendering graphics card dual use performance 【发布时间】:2014-03-01 07:24:50 【问题描述】:情况:
在一个既需要计算又需要渲染图像(图像预处理然后显示)的应用程序中,我想同时使用 AMP 和 WPF(AMP 对图像进行一些过滤,而 WPF 只做显示)缩放/旋转的图像和一些简单的叠加,都以大约 30fps 的速度运行,新图像将不断流入)。
问题:
有没有什么办法可以知道两者会如何相互影响?
我想知道我是否会在稍后的实际应用程序中看到我将在单独的 AMP 环境中看到的希望不错的加速。
附加信息:
我将能够并且将单独测量 AMP 性能,因为无论如何我都将在单独的项目中设置它是低级别的新功能。 WPF 渲染部分已经存在于复杂的应用程序中,因此很难将其隔离。
我不打算只为渲染进行过滤器等,因为中间级别也需要结果(其他算法,例如边缘检测、保存等)。
【问题讨论】:
您认为它们会以何种方式相互影响?毕竟,两者都只是由 cpu 执行的指令。 我强烈希望 WPF 渲染和 AMP 都在 GPU 上执行。所以他们会共享 GPU 资源。 (CPU 开销应该主要限于内存传输。) GPU 就像一个专门的 CPU。我不确定它只能做 AMP 部分而不是 WPF 部分是有原因的。毕竟它能够显示你的屏幕并同时做 AMP,对吧?无论如何:找出答案的唯一正确方法就是尝试一下。例如。将您的 AMP 内容编译为 dll,编写一个使用它的小型 C++/CLI dll,并具有启动 AMP 处理的功能。从您的 WPF 应用程序调用该函数。 【参考方案1】:这里有几件事你应该考虑;
有没有什么办法可以知道两者会如何相互影响?
直接不,但间接是。 WPF 和 AMP 都在使用 GPU 进行渲染。如果您的应用程序的 AMP 部分使用过多的 GPU 资源,则会干扰您的帧速率。 Cartoonizer case study from the C++ AMP book 使用 MFC 和 C++ AMP 完全按照您描述的方式进行操作。在具有高图像处理负载的较慢硬件上,您可以看到应用程序的响应能力受到影响。然而,在几乎所有情况下,在 GPU 上对图像进行卡通化要快得多,并且可以达到视频帧速率。
我想知道我是否会看到希望不错的加速
对于任何 GPU 应用程序,看到性能改进的关键在于,在 GPU(而不是 CPU)上运行计算所带来的加速必须弥补将数据复制到 GPU 和从 GPU 复制数据的额外开销。
在这种情况下,由于您还必须将数据从本机 (C++ AMP) 编组到托管 (WPF) 环境,因此会产生额外的开销。您需要注意通过确保您的数据类型是 blitable 并且不需要显式封送处理来有效地执行此操作。我实现了一个使用 WPF 和本机代码的N-body modeling application。
理想情况下,您希望在不通过 CPU 移动的情况下渲染 GPU 计算的结果。这是可能的,但如果您明确涉及 WPF,则不会。 N-body 示例通过将 DirectX 渲染区域直接嵌入到 WPF 中来实现此目的,然后直接从 AMP 数组中渲染数据。这主要是因为 WPF viewport3D 确实不能满足我的性能需求。对于渲染图像 WPF 可能没问题。
除非在 VS 2013 中发生了变化,否则您肯定希望您的 C++ AMP 代码位于单独的 DLL 中,因为在 C++/CLI 项目中使用本机代码时存在一些限制。
正如@stijn 建议的那样,我将构建一个小型原型,以确保您通过将一些计算移至 GPU 所获得的收益不会因为将数据移入和移出 GPU 以及移入 WPF 的开销而丢失.
【讨论】:
我想在 Ade 的回答中补充一点,理论上您可以拥有一个具有 2 个 GPU 的系统,其中一个将仅用于计算,另一个用于渲染。在这种情况下,干扰将很小甚至没有。另一方面,您可以拥有一个带有集成 GPU 的系统,您可以在 VS 2013 版 C++ AMP 中利用此类系统的数据传输改进。以上是关于C++ AMP计算和WPF渲染显卡两用性能的主要内容,如果未能解决你的问题,请参考以下文章