JavaCL-管理非常大的图像处理



我正在从事一个处理大型图像处理(每张图像50Mo)的工业项目,关键是性能。

我选择在JavaCL的帮助下将图像处理委托给GPU。我写了一些测试来确定这种方法是否正确。结果很清楚!

超过100次图像着色GPU运行获胜:GPU=172毫秒,而CPU=438毫秒

目前,很明显,对于这种计算,GPU比CPU更强大,但是!有一个问题,一个记忆的问题。事实上,我的显卡有256Mo的VRam,不能分配大于8Mo的图像!

所以,我的问题是,处理大于8Mo的图像的最佳方式是什么?

  1. 平铺图像并处理每个平铺?将成为性能杀手由于RAM和VRAM之间的延迟
  2. 提取原始像素作为float4矢量并将其发送到GPU
  3. 换我的显卡
  4. 放弃这个项目
  5. 多喝咖啡

感谢所有提前:-)

我不熟悉JavaCL绑定,但在OpenCL中,有图像,然后有缓冲区。

可以分配尽可能大的缓冲区,但使用clCreateImage2D创建的cl_mem(cl_DEVICE_IMAGE2D_MAX_WIDTH和cl_DEVICE_IMAGE2D.MAX_HEIGHT)的大小有限制。与原始缓冲区相比,图像具有一些优势,比如提供硬件加速采样。如果您不需要采样,或者可以在内核中实现自己的采样,那么可以使用缓冲区。否则,您将不得不平铺输入图像,并解决平铺处理将引入的任何过滤伪影。

希望这能有所帮助!

如果您对语言的选择持开放态度,那么我建议您使用CUVI(http://cuvilib.com)。它提供了现成的易于使用的成像功能。很多颜色运算,滤镜,边缘检测器,算术运算等等。它是用C语言编写的,有一个非常整洁的C++模块化接口。

是的,你也可以分配大图像!

我可以帮助你(或任何其他感兴趣的人)开始使用CUVI。在线wiki(http://wiki.cuvilib.com)是开始的正确地方。

披露:我是CUVI开发团队的一员。此外,CUVI是一个商业软件

最新更新