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

时间:2012-08-24 17:45:33

标签: java image-processing

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

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

超过100次图像着色GPU获胜: GPU = 172ms vs. CPU = 438ms

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

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

  1. 平铺图像并处理每个图块?将是性能杀手 由于RAM和VRAM之间的延迟
  2. 将原始像素提取为float4向量并将其发送到GPU?
  3. 更换我的显卡?
  4. 扔掉项目?
  5. 多喝咖啡?
  6. 提前感谢所有人: - )

2 个答案:

答案 0 :(得分:2)

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

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

希望这有帮助!

答案 1 :(得分:1)

如果您愿意选择该语言,那么我建议您使用CUVI(http://cuvilib.com)。它提供现成的易于使用的成像功能。大量的色彩操作,滤镜,边缘检测器,算术运算等等。它在C语言中具有非常简洁的C ++模块化接口。

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

我可以帮助您(或任何其他感兴趣的人)开始使用CUVI。在线维基(http://wiki.cuvilib.com)是开始使用的最佳位置。

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