2012-04-20 73 views
0

我第一次使用Accelerate框架来实现一些向量化代码到iOS应用程序的目标。我从来没有尝试过使用Objective C或C中的向量来处理任何事情。在使用MATLAB的一些经验的时候,我想知道使用Accelerate确实是一件多么痛苦的事情。假设我想计算以下内容:使用Accelerate框架编码矢量

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

MATLAB代码:

a = 1:4; 
b = 4*(sin(a/2)).^2; 

然而,当我看到它通过文档一些随地吐痰后,情况大不一样使用加速。

我的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(完全不同),或者花很多时间做一些非常微不足道的事情。

我真的很希望我在这里错过了一些东西,大多数步骤可以合并或缩短。任何关于编码资源的建议,良好的编码习惯(从书本上学习都很难)等等,都是非常值得欢迎的!你们如何处理多行向量计算?

+0

如果这个库需要2个被指针传递的变量来执行简单的划分,我会说库很糟糕。或者也许有一个你没有使用的非矢量分割。 – Shahbaz 2012-04-20 16:12:51

回答

1

我想你可以这样写,但对我来说似乎非常复杂。我喜欢这个更好(英特尔特有的,但可以很容易被抽象为其他架构):

#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; 

此外,刚要迂腐,你在做什么这里就不线性代数线性代数只涉及线性运算(无平方,没有像sin那样的超越运算)。


编辑:正如你所说,上述将不会在iOS上开箱即用;最大的问题是没有vsinf(vMathLib在iOS上的Accelerate中不可用)。我没有安装在我的机器上测试的SDK,但我相信,像下面应该工作:

#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}; 

不太一样漂亮什么是可能的vMathLib,但仍然相当紧凑。

一般来说,很多关于向量的基本算术运算只是起作用;没有必要使用任何图书馆的电话,这就是为什么加速不会干净地提供这些操作的原因。相反,Accelerate通常会尝试提供不能立即通过其他方式获得的操作。

+0

谢谢@Stephen。你完全正确的是这不是线性操作。你也让我意识到,我应该指出,这是针对iOS应用(因此,没有英特尔芯片),所以我只是更新了我的问题来反映这一点。 Apple似乎认为使用Accelerate框架是进行向量操作的最佳方式,所以我想知道我的实现是否确实如此。 – Tom 2012-04-22 11:19:46

0

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

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