在我的iOS
代码中,我有一个矩阵(float *
)变量,如下所示:
[ 1 2 3 4
5 6 7 8
9 0 1 2 ]
我需要为所有等于值的元素构建一个1
&#39的矩阵(例如,让2
说出来),{{1}其他一切都是如此。所以输出将是:
0
我已经在[ 0 1 0 0
0 0 0 0
0 0 0 1 ]
文档上搜索了一段时间,但我还没有找到办法来做到这一点。我找到了vDSP
方法,但看起来它会使得上限和下限(即,vDSP_vclip()
)的值等于2
。不完全是我正在寻找的东西。
有人知道如何使用2
中的Accelerate.framework
来完成此操作吗?如果我更正,那么这不是一个直接的方法,但是可以结合其他方法来完成同样的事情吗?
非常感谢任何建议!我完全被困在这里。
答案 0 :(得分:1)
如果您正在使用Xcode 6 beta,则clang自动矢量化器将为此操作生成良好(但不完美)的矢量代码。它不会像加速调用那样高效,但是没有一个可以达到你想要的加速功能。
#include <stddef.h>
void findTwos(float * restrict matrix, float * restrict ones, size_t n) {
for (size_t i=0; i<n; ++i) { ones[i] = matrix[i] == 2.0f; }
}
使用-Ofast
,-O3
或-O2
进行编译会在我的测试中生成体面的矢量代码(在arm64和x86_64上)。如果在编译时已知矩阵的大小,则用恒定长度替换变量大小参数n
也会导致-Os
处的向量化。
如果这还不够快,你总是可以编写自己的simd代码=)