我们的网络服务器需要先处理许多大图像的组合,然后再将结果发送到网络客户端。此过程对性能至关重要,因为服务器每小时可以接收数千个请求。
现在,我们的解决方案从 HD 加载 PNG 文件(每个大约 1MB)并将它们发送到显卡,以便在 GPU 上完成合成。我们首先尝试使用 XNA API 公开的 PNG 解码器加载图像。我们看到表现不太好。
为了了解问题是从 HD 加载还是 PNG 解码出现问题,我们通过将文件加载到内存流中进行修改,然后将该内存流发送到 .NET PNG 解码器。使用 XNA 或使用 System.Windows.Media.Imaging.PngBitmapDecoder 类的性能差异并不显着。我们大致获得相同水平的性能。
我们的基准测试显示了以下性能结果:
- 从磁盘加载图像:37.76ms 1%
- 解码 PNG:2816.97ms 77%
- 在视频硬件上加载图像:196.67ms 5%
- 成分:87.80ms 2%
- 从视频硬件获取合成结果:166.21ms 5%
- 编码为 PNG:318.13ms 9%
- 存储到磁盘:3.96ms 0%
- 清理:53.00ms 1%
总计:3680.50ms 100%
从这些结果中我们可以看出,最慢的部分是解码 PNG 时。
所以我们想知道是否有一个 PNG 解码器可以让我们减少 PNG 解码时间。我们还考虑过将未压缩的图像保留在硬盘上,但是每个图像的大小将是 10MB,而不是 1MB,并且由于硬盘上存储了数以万计的图像,因此不可能将它们全部存储在硬盘上。压缩。
编辑:更多有用的信息:
- 该基准测试模拟加载 20 个 PNG 图像并将它们合成在一起。这大致对应于我们在生产环境中收到的请求类型。
- 合成中使用的每张图像的尺寸均为 1600x1600。
- 该解决方案将涉及多达 10 台负载平衡服务器,就像我们在这里讨论的那样。因此,额外的软件开发工作可能值得节省硬件成本。
- 缓存解码后的源图像是我们正在考虑的事情,但每个合成很可能会使用完全不同的源图像来完成,因此缓存未命中率会很高,而性能增益会很低。
- 基准测试是使用蹩脚的显卡完成的,因此我们可以预期,使用像样的显卡时,PNG 解码会成为性能瓶颈。
还有另一种选择。也就是说,您编写自己的基于 GPU 的 PNG 解码器。您可以使用 OpenCL 相当高效地执行此操作(并使用可以与 OpenCL 共享资源的 OpenGL 执行合成)。还可以交错传输和解码以获得最大吞吐量。如果这是您可以/想要追求的路线,我可以提供更多信息。
以下是一些与基于 GPU 的 DEFLATE(和 INFLATE)相关的资源。
-
GPU 块压缩 http://code.google.com/p/gpu-block-compression/在 Google 代码上使用 CUDA。
-
- 请注意,这不使用 INFLATE/DEFLATE,而是使用一种新颖的并行压缩/解压缩方案,该方案对 GPU 更友好。
希望这可以帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)