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

时间:2014-01-29 23:32:26

标签: ios matrix opengl-es eigenvector accelerate-framework

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

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

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


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

2 个答案:

答案 0 :(得分:5)

作为组合状态,Accelerate使用SIMD来加速其许多功能,但它是基于CPU的。对于较小的数据集,它绝对是可行的方法,但在GPU上运行可以显着地超越它,以获得足够大的数据集,并且可以轻松实现并行操作。

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

矩阵转置操作可以快速实现,因为所有矩阵元素彼此独立。通过常数或小矩阵进行矩阵乘法也很容易,但我不确定如何正确地缩放两个大矩阵的乘法。同样地,我没有一个很好的特征分解实现,我可以指出我的头脑。

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

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

答案 1 :(得分:3)

加速框架并未在GPU上加速,但它已经过优化,并在Neon适当时使用SIMD。