使用加速框架32位与64位快速matrix乘法

我正在尝试使用Accelerate框架在Swift中进行matrix乘法。 使用了vDSP_mmulD。 这在iPhone6,6加iPad Air模拟器(所有64位体系结构)中都能很好地工作,但是在32位体系结构设备中没有任何作用。 它看起来像vDSP_mmulD不被32位体系结构识别,程序不会生成。 显示的错误信息是“使用未parsing的标识符'vDSP_mmulD'”有没有人看到这个错误? 请让我知道你的想法。 我正在使用Xcode 6.1。 谢谢。

简单的解决scheme:使用cblas_dgemm (也是Accelerate的一部分)。 它在所有系统上至less和vDSP_mmulD一样快,而在一些系统上速度要快得多(在iOS 8和Yosemite中, vDSP_mmulD实际上只是cblas_dgemm一个包装),实际上它应该在这里工作。

我怀疑你的构build失败的32位模拟器; 在i386上,vDSP_mmulD其实是一个围绕mmulD的macros,而Swift并不完全支持C语言的macros。

注意:我怀疑你可能正在使用3×3或4x4matrix,在这种情况下,Accelerate例程没有一个是你想要的(它们是针对更大的matrix的)。 你需要像<simd/matrix.h>定义的内联向量序列。 不幸的是,Swift不支持SIMD向量,所以这不是一个选项。 在这一点上,最好的办法是简单地写出元素计算,并报告一个错误,要求Swift支持<simd/simd.h>接口。

所以这都是推测性的,因为我现在没有32位设备来testing,而且我也找不到任何文档来支持这个,但也许Accelerate在两个不同的体系结构上使用不同的浮点types- 在32位架构上Float ,在64位架构上FloatvDSP_mmulD末尾的vDSP_mmulD表示Double ,因此您需要能够在代码中使用32位体系结构上的Float版本: vDSP_mmul

您可以使用#if...#else...#endif预处理块来切换您正在使用的方法( 本页底部的信息)。 解决Swift严格的静态types的一个诀窍就是把类似这个预处理块的东西放在文件的顶部:

 #if arch(x86_64) || arch(arm64) typealias M_Float = Double let M_vDSP_mmul = vDSP_mmulD // add Double versions of other Accelerate functions you need #else typealias M_Float = Float let M_vDSP_mmul = vDSP_mmul // add Float versions of other Accelerate functions you need #endif 

然后,不必select是使用Float还是Double ,或者在整个代码中使用哪种方法,只需使用M_FloatM_...版本的Accelerate函数即可:

 var number: M_Float = 0 // Double on 64-bit, Float on 32-bit M_vDSP_mmul(...) // correct version either way 

希望有所帮助!

我发现这个collections库 swift。 它提供了一个matrix结构乘法运算符使用加速。 为我工作。