有没有关于苹果M1/M2上SIMD循环次数的资源?就像x86一样https://uops.info/table.html或者Agner Fog的那种资源?我希望我能提供更多的奖励,但这是我拥有的所有声望。
我从未在ARM机器上编程过。我看了一下sse2neon https://github.com/DLTcollab/sse2neon/blob/7bd15eac51e36bf7426052f8515358cb665d8c04/sse2neon.h。
我查找的第一件事是setzero。我怀疑dup是否是正确的方法,所以我尝试了nanobench并发现xor更快,而sub本身则不同。
有没有什么东西可以让我大致了解一下?我的目标是M2。
我从未在ARM机器上编程过。我看了一下sse2neon https://github.com/DLTcollab/sse2neon/blob/7bd15eac51e36bf7426052f8515358cb665d8c04/sse2neon.h。
我查找的第一件事是setzero。我怀疑dup是否是正确的方法,所以我尝试了nanobench并发现xor更快,而sub本身则不同。
有没有什么东西可以让我大致了解一下?我的目标是M2。
#include <arm_neon.h>
#define ANKERL_NANOBENCH_IMPLEMENT
#include "nanobench.h"
int32x4_t setzeroA()
{
return vdupq_n_s32(0);
}
int32x4_t setzeroB()
{
int32x4_t v;
return vsubq_u32(v, v);
}
uint8x16_t setzeroC()
{
uint8x16_t v;
return veorq_u8(v, v);
}
int main() {
ankerl::nanobench::Bench().run("Set", [&] {
auto v = setzeroA();
ankerl::nanobench::doNotOptimizeAway(v);
});
ankerl::nanobench::Bench().run("sub", [&] {
auto v = setzeroB();
ankerl::nanobench::doNotOptimizeAway(v);
});
ankerl::nanobench::Bench().run("xor", [&] {
auto v = setzeroC();
ankerl::nanobench::doNotOptimizeAway(v);
});
}
doNotOptimizeAway
也使编译器认为该值已被破坏,因此必须重新生成一个零值。尽管编译器仍然可以使用另一个寄存器中的“mov”来实现这一点,在循环之外把实际的清零提升出来如果更便宜就会这样做。 - Peter Cordesmovi v0.2d,# 0000000000000000
来进行setzeroA
和setzeroC
,但是对于setzeroB
没有使用任何指令,显然它不喜欢未初始化的读取实例。 内置函数不是汇编语言; 就像您的编译器可能不会使用add
指令来执行4 + 5
一样,如果它理解内置函数的作用,它可能以不同的方式获得内置函数的结果。 (大多数内置函数都适用于clang。) - Peter Cordes