我正在使用加速框架来创建快速向量和矩阵库。将相同的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;
}
最佳答案
这个问题的完整答案有点复杂,因为“加速框架”由许多较小的库组成。广义上讲,对于“简单” vDSP函数(在输入缓冲区中可以线性工作的函数),例如vDSP_vadd
,是的,可以安全地使用“就地”函数(即,其中一个输入缓冲区也是输出缓冲区) )。
但是,我应该指出,您不想使用vDSP_vadd
来添加长度为3的向量。这只需要三个标量运算或一个向量运算即可。即使是最简单的标量实现,也可以在对vDSP_vadd
进行函数调用之前完成。您实际上要寻找的是<simd/simd.h>
,其中包含SIMD实现的小(2维,3维,4维)向量以及适用于iOS和OS X的矩阵算术。运算符重载已在此处为您定义,因此您可能不需要自己做很多事情:
#include <simd/simd.h>
using namespace simd;
float3 x = { 0, 1, 2 };
float3 y = { 1, 1, 1 };
float3 z = 2*x - y;
... etc
关于ios - 在Accelerate Framework中,对输入和输出使用相同的引用是否安全?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28814324/