我想使用 GPU 功能将 8 位灰度 JPEG 转换为 32 位 argb JPEG,而不使用 CPU 资源。
下面是我的 SharpDX 代码,它是使用 CPU 函数将 8 位 JPEG 转换为 32 位 JPEG,我想用 GPU 函数替换它。
using (MemoryStream ms = new MemoryStream(viewModelResultImage.JpegData))
{
var decoder = new SharpDX.WIC.BitmapDecoder(_wicFactory, ms, DecodeOptions.CacheOnLoad);
var frame = decoder.GetFrame(0);
var formatConverter = new FormatConverter(_wicFactory);
formatConverter.Initialize(frame, SharpDX.WIC.PixelFormat.Format32bppPBGRA);
BitmapUp1Channel0 = D2D1.Bitmap.FromWicBitmap(_renderTarget, formatConverter);
}
我之前使用CPU功能,将9344 X 7000 8位JPEG转换为32位需要300ms。
编辑:它是 8bit > 32bit argb,所以我更改了上下文(我之前注意到 8bit > 24bit)
每当您担心性能时,第一步应该是测量。显然您已经做到了这一点,但是进行一些分析来找出什么部分需要时间也非常有用。
我的猜测是,实际的 8 位 -> 24 位转换并不需要时间,因为这是非常简单的工作。我自己的多线程但非 SIMD 代码大约需要 10 毫秒。优化良好的 SIMD 版本可能会受到带宽限制,而不是计算限制。因此,由于将图像传输到 GPU 内存并返回需要额外的时间,因此使用 GPU 可能会更慢。
如果您在测量中包括解码/编码时间,这可能是大部分时间花费的地方。那么GPU可以辅助jpeg编码/解码吗?有点儿。数据压缩特别不适合 GPU,因为存在固有的数据依赖性。但媒体压缩通常包括一个变换步骤,通常是离散余弦变换,这适合 GPU。因此,混合方法可能是可行的。
快速谷歌搜索“gpu jpeg 库”表明有多种选择。如果您需要建议,请参阅 https://softwarerecs.stackexchange.com/。
任何 GPU 解决方案的缺点是兼容性问题都很常见。所以我至少会寻找更快的基于 CPU 的库,也许https://libjpeg-turbo.org/?