6

我正在从事一个处理大型图像处理(每张图像 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. 多喝咖啡?

提前感谢所有人:-)

4

2 回答 2

2

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

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

希望这可以帮助!

于 2012-08-24T20:57:29.070 回答
1

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

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

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

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

于 2012-08-25T07:59:47.993 回答