Coding style 使用加速框架的矢量编码

Coding style 使用加速框架的矢量编码,coding-style,vectorization,accelerate-framework,Coding Style,Vectorization,Accelerate Framework,我第一次使用Accelerate框架,目标是在iOS应用程序中实现一些矢量化代码。我从来没有尝试过在目标C或C中使用向量。有一些使用MATLAB的经验,我想知道使用加速是否真的那么痛苦。假设我想计算以下各项: b=4*(sin(a/2))^2其中a和b是向量 MATLAB代码: a = 1:4; b = 4*(sin(a/2)).^2; 然而,正如我在浏览了一些文档之后所看到的,使用Accelerate的情况大不相同 My C实现: float a[4] = {1,2,3,4};

我第一次使用Accelerate框架,目标是在iOS应用程序中实现一些矢量化代码。我从来没有尝试过在目标C或C中使用向量。有一些使用MATLAB的经验,我想知道使用加速是否真的那么痛苦。假设我想计算以下各项:

b=4*(sin(a/2))^2
其中a和b是向量

MATLAB代码:

a = 1:4;
b = 4*(sin(a/2)).^2;
然而,正如我在浏览了一些文档之后所看到的,使用Accelerate的情况大不相同

My C实现:

float a[4]  = {1,2,3,4};                        //define a
int len     = 4;
float div   = 2;                                //define 2
float a2[len];                                  //define intermediate result 1
vDSP_vsdiv(a, 1, &div, a2, 1, len);             //divide
float sinResult[len];                           //define intermediate result 2
vvsinf(sinResult, a2, &len);                    //take sine
float sqResult[len];                            //square the result
vDSP_vsq(sinResult, 1, sqResult, 1, len);       //take square
float factor = 4;                               //multiply all this by four
float b[len];                                   //define answer vector
vDSP_vsmul(sqResult, 1, &factor, b, 1, len);    //multiply

//unset all variables I didn't actually need
老实说,我不知道这里最糟糕的是什么:跟踪所有中间步骤,试图记住vDSP中关于VecLib的参数是如何传递的(非常不同),或者做一些非常琐碎的事情需要花费大量时间


我真的希望我在这里遗漏了一些东西,大多数步骤可以合并或缩短。任何关于编码资源、良好编码习惯(通过艰苦的学习或从书中学习)等方面的建议都是非常受欢迎的!你们都是如何处理多行向量计算的?

我想你们可以这样写,但对我来说它似乎太复杂了。我更喜欢这一点(特定于英特尔,但可以很容易地抽象为其他体系结构):

不像vMathLib那样漂亮,但仍然相当紧凑

一般来说,向量上的许多基本算术运算都是有效的;不需要使用对任何库的调用,这就是为什么Accelerate没有特意提供这些操作的原因。相反,Accelerate通常尝试通过其他方式提供无法立即使用的操作。

回答我自己的问题: 在iOS 6中,将引入vMathLib。正如Stephen所澄清的,vMathLib已经可以在OSX上使用,但它在iOS中不可用。直到现在


vMathLib提供的函数将允许更简单的向量计算。

如果此库需要2位于指针传递的变量中以执行简单除法,我认为该库很糟糕。或者可能有一个非矢量除法你不用。谢谢@Stephen。你完全正确,这不是线性运算。你还让我意识到,我应该指出这是针对iOS应用程序的(因此,没有Intel芯片),所以我只是更新了我的问题以反映这一点。苹果让人觉得使用加速框架是对向量进行操作的最佳方式,所以我想知道我的实现是否真的像它得到的那样好。
#include <Accelerate/Accelerate.h>
#include <immintrin.h>

const __m128 a = {1,2,3,4};
const __m128 sina2 = vsinf(a*_mm_set1_ps(0.5));
const __m128 b = _mm_set1_ps(4)*sina2*sina2;
#include <Accelerate/Accelerate.h>

const vFloat a = {1, 2, 3, 4};
const vFloat a2 = a*(vFloat){0.5,0.5,0.5,0.5};
const int n = 4;
vFloat sina2;
vvsinf((float *)&sina2, (const float *)&a, &n);
const vFloat b = sina2*sina2*(vFloat){4,4,4,4};