2

情况:

在一个既需要计算又需要渲染图像(图像预处理然后显示)的应用程序中,我想同时使用 AMP 和 WPF(AMP 对图像进行一些过滤,而 WPF 仅显示缩放/旋转的图像)图像和一些简单的叠加层,都以大约 30fps 的速度运行,新图像将不断流入)。

问题:

有什么方法可以找出两者将如何相互影响?

我想知道我是否会在稍后的实际应用程序中看到在一个孤立的仅 AMP 环境中看到的希望不错的加速。

附加信息:

我将能够并且将单独测量 AMP 性能,因为它是低级别的新功能,无论如何我都将在单独的项目中设置。WPF 渲染部分已经存在于一个复杂的应用程序中,因此很难将其隔离。

我不打算只为渲染进行过滤器等,因为中间级别也需要结果(其他算法,例如边缘检测、保存等)。

4

1 回答 1

2

您应该在这里考虑几件事;

有什么方法可以找出两者将如何相互影响?

直接不是,但间接是。WPF 和 AMP 都在使用 GPU 进行渲染。如果您的应用程序的 AMP 部分使用过多的 GPU 资源,则会干扰您的帧速率。C++ AMP 书中的Cartoonizer 案例研究使用 MFC 和 C++ AMP 完全按照您描述的方式进行操作。在具有高图像处理负载的较慢硬件上,您可以看到应用程序的响应能力受到影响。然而,在几乎所有情况下,在 GPU 上对图像进行卡通化要快得多,并且可以达到视频帧速率。

我想知道我是否会看到有希望的加速

对于任何 GPU 应用程序,看到性能改进的关键在于,在 GPU 而不是 CPU 上运行计算所带来的加速必须弥补从 GPU 复制数据和从 GPU 复制数据的额外开销。

在这种情况下,还有额外的开销,因为您还必须将数据从本机 (C++ AMP) 编组到托管 (WPF) 环境。您需要注意通过确保您的数据类型是 blitable 并且不需要显式封送处理来有效地执行此操作。我实现了一个使用 WPF 和本机代码的N 体建模应用程序。

理想情况下,您希望在不通过 CPU 移动的情况下渲染 GPU 计算的结果。这是可能的,但如果您明确涉及 WPF,则不会。N-body 示例通过将 DirectX 渲染区域直接嵌入到 WPF 中来实现这一点,然后直接从 AMP 数组中渲染数据。这主要是因为 WPF viewport3D 确实不能满足我的性能需求。对于渲染图像 WPF 可能没问题。

除非 VS 2013 发生了变化,否则您肯定希望您的 C++ AMP 代码位于单独的 DLL 中,因为在 C++/CLI 项目中使用本机代码时存在一些限制。

正如@stijn 建议的那样,我将构建一个小型原型,以确保您通过将一些计算移至 GPU 获得的收益不会因为将数据移入和移出 GPU 以及移入 WPF 的开销而丢失。

于 2014-03-04T01:36:24.703 回答