首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用4x4矩阵加速iOS 4

使用4x4矩阵加速iOS 4
EN

Stack Overflow用户
提问于 2010-10-17 03:19:54
回答 2查看 2.3K关注 0票数 6

我一直在研究iOS 4中提供的加速框架。具体地说,我尝试使用C语言线性代数库中的Cblas例程。现在,我无法使用这些函数来获得比非常基本的例程更高的性能。具体地说,4x4矩阵乘法的情况。只要我不能利用矩阵的仿射或齐次性质,我就一直在使用这个例程(删节):

代码语言:javascript
运行
复制
float *mat4SetMat4Mult(const float *m0, const float *m1, float *target) {
    target[0] = m0[0] * m1[0] + m0[4] * m1[1] + m0[8] * m1[2] + m0[12] * m1[3];
    target[1] = ...etc...
    ...
    target[15] = m0[3] * m1[12] + m0[7] * m1[13] + m0[11] * m1[14] + m0[15] * m1[15];
    return target;
}

Cblas的等效函数调用为:

代码语言:javascript
运行
复制
cblas_sgemm(CblasColMajor, CblasNoTrans, CblasNoTrans,
   4, 4, 4, 1.f, m0, 4, m1, 4, 0.f, target, 4);

将两者进行比较,通过让它们运行大量充满随机数的预计算矩阵(每个函数每次都获得完全相同的输入),当使用clock()函数计时时,Cblas例程的执行速度大约要慢4倍。

这对我来说似乎不对,我留下的感觉是我在哪里做错了什么。我必须以某种方式启用设备的霓虹灯单元和SIMD功能吗?或者我不应该希望在这么小的矩阵上有更好的性能吗?

非常感谢,

巴斯蒂安

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-05 02:16:34

BLAS和LAPACK库是为使用我认为的“中型到大型矩阵”而设计的(从几十到几万)。对于较小的矩阵,它们将提供正确的结果,但性能将不会像预期的那样好。

这有几个原因:

  • 为了提供最佳性能,3x3和4x4矩阵运算必须内联,而不是在库中;当要做的工作如此之少时,进行函数调用的开销太大而无法克服。
  • 需要一组完全不同的接口才能提供最佳性能。矩阵乘法的BLAS接口接受变量来指定计算中涉及的矩阵的大小和前导尺寸,更不用说是否转置矩阵和存储布局了。所有这些参数使库变得强大,并且不会影响大型矩阵的性能。但是,当它确定您正在进行4x4计算时,这个函数专门用于执行4x4矩阵运算,其他任何操作都已完成。

这对你意味着什么:如果你想要提供专门的小矩阵运算,请转到bugreport.apple.com并提交一个bug来请求这个特性。

票数 4
EN

Stack Overflow用户

发布于 2010-11-01 23:23:17

苹果WWDC2010的演示文稿说,即使是3x3矩阵运算,Accelerate仍然可以提供加速,所以我假设您应该看到4x4的略微改进。但您需要考虑的是,Accelerate & NEON的设计目的是大大提高整数运算的速度,但不一定是浮点运算。您没有提到您的CPU处理器,而且似乎Accelerate将根据您的CPU使用NEON或VFP进行浮点运算。如果它使用霓虹灯指令进行32位浮点运算,那么它应该运行得很快,但如果它使用VFP进行32位浮点或64位双精度运算,那么它将运行得非常慢(因为VFP实际上不是SIMD)。因此,您应该确保您使用的是32位浮点运算与加速,并确保它将使用霓虹灯而不是VFP。

另一个问题是,即使它使用霓虹灯,也不能保证你的C编译器会比没有霓虹灯指令的简单C函数生成更快的霓虹灯代码,因为像GCC这样的C编译器经常生成糟糕的SIMD代码,可能比标准代码运行得慢。这就是为什么测试生成代码的速度总是很重要的原因,并可能手动查看生成的汇编代码,以查看您的编译器是否生成了错误代码。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3950383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档