用于跨平台 GPU 编程的 C++、OpenCV 和 "what"

C++, OpenCV and "what" for cross-platform GPU programing

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

P.S。这可能会显示为离题,如征求建议。但实际上,我并不是在许多可用选项之间询问。我只是问这通常是如何完成的,或者这个领域的最新技术是什么。

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

  • OpenCL 适用于配备 nVidia GPU 或任何其他供应商的各种桌面站,以及 Android 上的 GPU 编程.
  • Metal 用于 iOS 上的 GPU 编程,因为移植您的 OpenCL 实现并不费力:

If you’re thinking that Metal could be a reason – that language looks very much like OpenCL, as it’s simply OpenCL as Apple would like it to be. Porting between the two languages is therefore quite simple. This also means that with some small fixes a Metel-kernel could be compiled by existing OpenCL-compiler.

(http://streamcomputing.eu/blog/2015-05-09/apples-dragging-opencl-compiler-problem/,上次访问时间:2015 年 12 月 7 日)

关于 OpenCV

OpenCV 部分支持 OpenCL (http://docs.opencv.org/2.4/modules/ocl/doc/introduction.html, Last accessed at 07.12.2015), however afaik there is no way OpenCV does utilize the GPU under iOS (OpenCV on iOS - GPU usage?).

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

对于多平台,我将主张将其保留在 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 快得多,即 phone 英特尔首次发布 Core i 系列 (2008) 与现在可用的产品相比,您可以获得的类型。

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

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