【问题标题】:C++, OpenCV and "what" for cross-platform GPU programing [closed]用于跨平台 GPU 编程的 C++、OpenCV 和“什么”[关闭]
【发布时间】:2016-03-12 06:28:48
【问题描述】:

我想为计算机视觉问题编写一个跨平台代码。此代码应在具有 GPU (nVidia) 的 PC、具有 GPU 的 iPhone 和一些可能包含 GPU 且可能不包含 GPU 的基于 Android 的设备上运行。我想最大限度地利用现有硬件。我的编程语言是 C++ 11,我的计算机视觉库是 OpenCV。什么是最好的框架、层、技术……等等,以便编写一个隔离的高级代码,如果它可用的话,可以从 GPU 中使用。

附:这可能会被显示为离题,就像要求推荐一样。但实际上,我并不是在问许多可用的选项。我只是在问这通常是如何完成的,或者这个领域的最新技术是什么。

【问题讨论】:

  • opencv 有内置的 CUDA 支持,对吧?
  • 使用 glsl(或者现在称为着色语言)以获得最佳兼容性。 OpenCV 可能是第二好的,但不确定有多少移动设备支持它......

标签: android c++ ios opencv gpu


【解决方案1】:

我认为以下技术堆栈非常适合您的要求:

  • OpenCL 适用于配备 nVidia GPU 或任何其他供应商的各种桌面工作站以及在 Android 上进行 GPU 编程。
  • Metal 用于 iOS 上的 GPU 编程,因为它几乎不需要移植您的 OpenCL 实现:

如果您认为 Metal 可能是一个原因 - 该语言看起来非常像 OpenCL,因为它只是 Apple 所希望的 OpenCL。因此,两种语言之间的移植非常简单。这也意味着通过一些小的修复,Metel 内核可以由现有的 OpenCL 编译器编译。

http://streamcomputing.eu/blog/2015-05-09/apples-dragging-opencl-compiler-problem/,上次访问时间为 07.12.2015)

关于 OpenCV

OpenCV 部分支持OpenCLhttp://docs.opencv.org/2.4/modules/ocl/doc/introduction.html,上次访问时间为 07.12.2015),但是 afaik 没有办法 OpenCViOS 下使用 GPU (OpenCV on iOS - GPU usage? )。

所以 iOS 将是在将基于 OpenCV 的算法移植到该平台方面的棘手部分,如果您希望它是 GPU 加速的话。

【讨论】:

  • Android 上的 OpenCL 没有 Google/Android 的官方支持(请参阅:stackoverflow.com/questions/14385843/…),但似乎他们并没有阻止各个 CPU/GPU 供应商通过他们自己的 SDK 添加它.
  • @Morrison Chang 很好。你知道一些供应商这样做的例子吗?
  • Intel有SDK,我可能误认为nVidia的CUDA支持,相信高通的Adreno SDK有支持。尽管对于 OP 关于移动设备的问题,我倾向于不使用 GPU(大屏幕 = 最大 GPU),而是通过通常的 C/C++ 库利用额外的 CPU 内核。
  • 因此,在这种情况下,我必须为每个平台编写三个不同的实现.. 用于 PC 的 OpenCL(或直接用于 CUDA,因为它在 Android 上不是标准的),用于 Android 的 RenderScript 和用于 iOS 的 Metal。 . 所以我可以将 OpenCV 仅用于 CUDA 部分,而我必须自己处理其他部分.. 我做对了吗?
  • @HumamHelfawi 是的,我就是这么看的!
【解决方案2】:

对于多平台,我将主张将其保留在 C/C++ 中并使用通常的线程库。

虽然在 iOS 中只有一个供应商,OpenCV 团队可以根据需要投入精力进行调整,但在 Android 中,CPU/GPU 供应商混合在一起,因此 Google/Android 团队选择了 RenderScript (Why did Google choose RenderScript instead of OpenCL ) 并且不正式支持 OpenCL。包括非 RenderScript GPU 计算选项必须来自各个供应商,例如 Intel、Qualcomm,并且为了完整性,需要 nVidia 的 CUDA。

意识到移动平台的发展速度比 PC 快得多,也就是说,您可以使用英特尔首次发布 Core i 系列 (2008) 的手机类型与现在可用的手机类型相比。

在 OpenGL ES 3.1 和 Vulkan 中还有计算着色器。因此,如果您正在寻找基线 - 您最好在 C/C++ 线程领域。

现在,如果您确实有一个需要提升性能的移动应用程序,那么您可以确定在您选择的移动平台上需要进行哪些优化。

【讨论】:

  • 谢谢,您提到“您在 C/C++ 线程领域会更好”。 C++ 中的线程库是否使用 GPU?或者你的意思是我可以通过在多个内核上并行工作来获得更高的性能?
  • 通过线程库在多个 CPU 内核上并行工作,获得更高的性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
相关资源
最近更新 更多