我正在开发一个需要在iOS平台上使用向量和矩阵的库.我决定研究OpenGLES,因为我计划进行的矩阵和矢量操作(主要是转置,矩阵乘法和特征分解)肯定会受益于GPU加速.
问题是我不熟悉OpenGLES,老实说可能不是最好的选择.如果我要使用OpenGLES,我是否必须手动编写执行矩阵转置,乘法和特征分解的算法?或者是否有另一个Apple或第三方框架可以帮助我完成这些任务.
然而,主要的分歧是我希望这些操作是GPU加速的.
Brad Larson.. 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可以快〜100-1000倍)在这方面,iPhone 4的顶点处理和CPU速度几乎没有快速提升.
作为组合状态,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可以快〜100-1000倍)在这方面,iPhone 4的顶点处理和CPU速度几乎没有快速提升.