Tag: avx512

在XeonPhi上使用AVX内联汇编的矢量和

我是新手使用XeonPhi Intel协处理器。 我想使用AVX 512位指令为简单的矢量和编写代码。 我使用k1om-mpss-linux-gcc作为编译器,并希望编写内联汇编。 这是我的代码: #include #include #include #include #include #include void* aligned_malloc(size_t size, size_t alignment) { uintptr_t r = (uintptr_t)malloc(size + –alignment + sizeof(uintptr_t)); uintptr_t t = r + sizeof(uintptr_t); uintptr_t o =(t + alignment) & ~(uintptr_t)alignment; if (!r) return NULL; ((uintptr_t*)o)[-1] = r; return (void*)o; } int main(int argc, char* argv[]) { […]

缺少面具的AVX-512内在函数?

英特尔的内在指南列出了 AVX-512 K *掩码指令的一些内在函数 ,但似乎有一些缺失: KSHIFT {L / R} KADD KTEST 英特尔开发人员手册声称内在函数不是必需的,因为它们是由编译器自动生成的。 一个人怎么做呢? 如果这意味着__mmask *类型可以被视为常规整数,那么它会很有意义,但是像mask << 4这样的测试似乎会导致编译器将掩码移动到常规寄存器,移动它,然后再移回到面具。 这是使用Godbolt最新的GCC和ICC -O2 -mavx512bw 。 另外有趣的是,内在函数只处理__mmask16而不是其他类型。 我没有测试太多,但看起来ICC并不介意采用不正确的类型,但GCC似乎确实尝试确保掩码中只有16位,如果你使用内在函数。 我是不是在寻找上述指令的正确内在函数,以及其他__mmask *类型变体,还是有其他方法可以实现相同的东西而不需要求助于内联汇编?

在GNU C inline asm中,对于单个操作数,xmm / ymm / zmm的修饰符是什么?

在尝试使用内在函数和汇编来回答嵌入式广播时 ,我试图做这样的事情: __m512 mul_broad(__m512 a, float b) { int scratch = 0; asm( “vbroadcastss %k[scalar], %q[scalar]\n\t” // want vbr.. %xmm0, %zmm0 “vmulps %q[scalar], %[vec], %[vec]\n\t” // how it’s done for integer registers “movw symbol(%q[inttmp]), %w[inttmp]\n\t” // movw symbol(%rax), %ax “movsbl %h[inttmp], %k[inttmp]\n\t” // movsx %ah, %eax : [vec] “+x” (a), [scalar] “+x” (b), [inttmp] “=r” […]