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渲染显卡两用性能的主要内容,如果未能解决你的问题,请参考以下文章

我是不是认为现代消费类显卡使用完全相同的 GPU 结构进行实际图形渲染和裸计算?

ubuntu如何用Intel集成显卡渲染桌面,NV卡做计算

提高 WPF UI 渲染速度的方法

虚拟化下的显卡

A100显卡是啥?有了解的吗?

mtt s30相当于什么显卡 mtt s30评测 mtts80显卡性能