在Accelerate Framework中,对输入和输出使用相同的引用是否安全?

时间:2015-03-02 16:09:22

标签: ios accelerate-framework

我正在使用加速框架来创建一个快速矢量和矩阵库。将相同的float数组用作输入和输出是否安全?代码是否安全?

Vec3f& Vec3f::operator+=(const Vec3f& rhs)
{
  // this->xyz is input and output.  Have I crossed the beams?
  vDSP_vadd(this->xyz, 1, rhs.xyz, 1, this->xyz, 1, 3);
  return *this;
}

2 个答案:

答案 0 :(得分:2)

这个问题的完整答案有点复杂,因为“加速框架”由许多较小的库组成。一般来说,对于“简单”vDSP函数(那些在其输入缓冲区中工作线性的函数),如vDSP_vadd,是的,使用“就地”函数是安全的(即其中一个输入缓冲区是也是输出缓冲区。)

但是,我应该指出,您不希望使用vDSP_vadd添加长度为3的向量。这只需要三个标量操作或单个向量操作;甚至最简单的标量实现也可以在你对函数vDSP_vadd进行调用之前完成。您实际需要的是<simd/simd.h>,它包含针对iOS和OS X的小(2维,3维,4维)向量和矩阵运算的SIMD实现。已经为您定义了运算符重载,所以你可能不需要自己做太多事情:

#include <simd/simd.h>
using namespace simd;
float3 x = { 0, 1, 2 };
float3 y = { 1, 1, 1 };
float3 z = 2*x - y;
... etc

答案 1 :(得分:0)

使用加速框架的主要好处是可以充分利用其针对 ARM 架构进行优化的能力。

  

重要信息:为了获得最佳性能,vDSP例程不执行错误检查,也不返回完成代码。假定所有参数都被正确指定和传递,并且这些责任在于调用者

为了深入了解它是如何做到的,WWDC 2013 Session 713提供了非常丰富的信息。

以下代码是否安全? - 我不确定,但是为了达到最佳性能,我不推荐它。