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

3
我正在开发一个需要在iOS平台上使用向量和矩阵的库。我决定研究OpenGLES,因为我计划进行的矩阵和向量操作(主要是转置、矩阵乘法和特征分解)肯定可以从GPU加速中受益。
问题在于我对OpenGLES并不是很熟悉,而且可能不是最佳选择。如果我要利用OpenGLES,那么我是否必须手动编写执行矩阵转置、乘法和特征分解的算法?还是有其他苹果或第三方框架可以帮助我完成这些任务?
然而,主要的分歧在于我希望这些操作能够得到GPU加速。
我将使用Accelerate Framework和矢量化算术来实现我的程序,然后测试一下它是否足够快,如果不够快,那么再尝试GPU实现。

你可能正在寻找的是openCL。你将不得不实现自己的算法,但从一些C源代码移植应该不难。很难说是否已经有人做过你正在尝试做的事情,因为只有在需要同时对一些非常大的矩阵(1000个或更多)进行操作时,才能从GPU中受益。虽然GLSL(着色器语言)包括一些基本的矩阵操作,但大部分工作应该在CPU上完成,对于基本的绘图,你只需要在顶点着色器中将一个向量乘以一个单独的矩阵。 - Matic Oblak
那么,如果我试图乘以或分解非常大的矩阵,比如在Eigenface操作中发现的那些(大小为wh x wh的矩阵),我不一定会从GPU加速中受益? - Robby Cohen
2个回答

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在他的博客上有一个非常详细的写作(连接)。这可能是更好的GPGPU操作的一般方法,但是如果您可以让操作针对片段着色器中的纹理数据运行,则可以在最新的硬件上获得巨大的加速(iPhone 5S在这方面可以比iPhone 4快100-1000倍,其中顶点处理和CPU速度并没有如此迅速地发展)。

对于转置和乘法,GPU 是一个不需要考虑的选择。然而,特征分解的某些部分非常繁琐,它并不适合于 GPU 计算(除非矩阵大小绝对巨大)。 - Stephen Canon
尝试在GPU上加速矩阵转置可能毫无意义,因为该操作受内存限制,不会有任何加速。 - Ciro Santilli OurBigBook.com

3

加速框架并没有在GPU上进行加速,但是它经过了很好的优化,并在适当的情况下使用Neon上的SIMD。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接