iOS - GPU 加速矩阵转置、乘法和特征分解困境

标签 ios matrix opengl-es eigenvector accelerate-framework

我正在开发一个需要在 iOS 平台上使用向量和矩阵的库。我决定研究 OpenGLES,因为我计划进行的矩阵和向量操作(主要是转置、矩阵乘法和特征分解)绝对可以从 GPU 加速中受益。

问题是我不太熟悉 OpenGLES,老实说这可能不是最佳选择。如果我要使用 OpenGLES,我是否必须手动编写执行矩阵转置、乘法和特征分解的算法?或者是否有其他 Apple 或第 3 方框架可以帮助我完成这些任务。

然而,主要的分歧是我希望这些操作能够进行 GPU 加速。


我将使用 Accelerate Framework 和矢量化算法实现我的程序,然后测试它是否足够快以达到我的目的,如果不够快,则尝试 GPU 实现。

最佳答案

作为组合状态,Accelerate 使用 SIMD 来加速其许多功能,但它是基于 CPU 的。对于较小的数据集,这绝对是可行的方法,但在 GPU 上运行可以明显优于它,对于足够大的数据集以及易于并行化的操作。

为了避免自己编写所有 OpenGL ES 交互代码,您可以查看我的 GPUImage框架,它在 Objective-C 中封装了片段着色器操作。特别是,您可以使用 GPUImageRawDataInput 和 GPUImageRawDataOutput 类将原始字节数据输入 GPU,然后使用自定义片段着色器对其进行操作。

矩阵转置操作可以快速实现,因为所有矩阵元素都是相互独立的。矩阵乘以常数或小矩阵也很容易做到,但我不确定如何正确缩放两个大矩阵的乘法。同样,我没有一个很好的本征分解实现,我可以立即指出。

处理片段着色器处理的缺点是默认情况下 OpenGL ES 在每个像素处接收和输出 4 字节 RGBA 值。您可以在较新的设备上将其更改为半 float ,我知道其他人已经使用此框架完成了此操作,但我自己还没有尝试过。您可以将单个浮点值打包成 RGBA 字节并在最后解包,作为将此数据传入和传出 GPU 的另一种方法。

最新的 A7 设备对 OpenGL ES 3.0 的支持为处理 float 据提供了一些其他机会。您可以使用顶点数据而不是纹理输入,这样您可以为每个顶点提供四个 float 并在最后提取这些 float 。 Bartosz Ciechanowski 有 a very detailed writeup of this on his blog .对于 GPGPU 操作,这可能是一种更好的通用方法,但如果您可以让您的操作针对片段着色器中的纹理数据运行,您将看到最新硬件的巨大加速(iPhone 5S 可以比 iPhone 5S 快 100-1000 倍在这方面,iPhone 4 的顶点处理和 CPU 速度几乎没有那么快地提高)。

关于iOS - GPU 加速矩阵转置、乘法和特征分解困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21444982/

相关文章:

linux - 使用linux脚本减去两个矩阵

r - 从 R 创建一个由零和一组成的矩阵

python - 使用python旋转矩阵时出现问题

ios - 锁定屏幕或进入后台时 OpenGL ES 应用程序崩溃

android - 每个顶点超过 1 个法线

android - 寻找适用于 iOS 和 Android 的基本 2D/3D 图形的跨平台方法

ios - mapView的框架错误

ios - 上传了我的应用程序,该应用程序的包标识符中没有 “com.”

ios - 获取 iOS 中 GPU 使用的内存

java - 根据分辨率更改 3D 模型纹理