Ios 在Accelerate框架中,对输入和输出使用相同的引用安全吗?

Ios 在Accelerate框架中,对输入和输出使用相同的引用安全吗?,ios,accelerate-framework,Ios,Accelerate Framework,我正在使用accelerate框架创建一个快速向量和矩阵库。使用相同的浮点数组作为输入和输出安全吗?下面的代码安全吗 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 *

我正在使用accelerate框架创建一个快速向量和矩阵库。使用相同的浮点数组作为输入和输出安全吗?下面的代码安全吗

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

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

重要提示:为了获得最佳性能,vDSP例程不执行错误检查,也不返回完成代码。假定所有参数都已正确指定和传递,这些责任由调用方承担

为了深入了解它是如何做到这一点的,本文提供了非常丰富的信息


下面的代码安全吗我不确定,但是为了获得最佳性能,我不推荐它。

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

但是,我应该指出,您不希望使用
vDSP\u vadd
来添加长度为3的向量。只需要三个标量运算或一个向量运算;即使是最简单的标量实现也将在您调用函数
vDSP\u vadd
之前完成。您实际需要的是
,它包含用于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
#包括
使用名称空间simd;
float3x={0,1,2};
float3y={1,1,1};
浮动3 z=2*x-y;
... 等

为获得最佳性能,最好在可能的情况下就地操作。减少了对齐案例的数量,并使用了更少的内存。遗憾的是,对于大多数vDSP.h函数,它是否有效都没有文档记录。