【发布时间】:2020-03-26 11:14:58
【问题描述】:
指令存在 (vbroadcastss zmm/m32),但似乎没有生成它的内在因素。
我可以把它编码为
static inline __m512 mybroadcast(float *x) {
__m512 v;
asm inline ( "vbroadcastss %1,%0 "
: "=v" (v)
: "m" (*x)
);
return v;
}
有没有办法在没有内联 asm 的情况下做到这一点?
【问题讨论】:
-
您忘记在标签中指定使用哪种语言
-
这将完全取决于编译器......但我怀疑“不:你已经得到了你可能找到的最佳解决方案”。
-
@FoggyDay 我在考虑标准的英特尔内在函数。
-
@JL2210: 是的,这是一个错字,
x操作数应该是"m"(*x)告诉编译器你希望 float 在内存中,而不是在内存中的指针.或者更好,"xm"(*x)可能会让编译器在 XMM 寄存器中而不是内存中将它提供给您,以防万一;与 AVX1 不同,vbroadcastss的 AVX2 和 AVX512 版本可用作 reg-reg shuffle 和负载。 felixcloutier.com/x86/vbroadcast。无论如何,这仍然比内在函数更糟糕,因为它在其他方面破坏了持续传播优化。 -
@PeterCordes 你不应该进行这样的全面编辑。
标签: c intrinsics avx512