作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何指示 Visual C++ 编译器 (1926) 使用未初始化的 __m512i
登记。在以下代码片段中 not(or(A,B))
经计算,dummy
的内容无关紧要。
__m512i dummy;
const __m512i n8 = _mm512_ternarylogic_epi64(dummy, A, B, 0x11);
zmm0
生成了一个昂贵且不必要的内存引用。 :
62 F1 7E 48 6F 45 00 vmovdqu32 zmm0,zmmword ptr [rbp]
62 F3 DD 48 25 C5 11 vpternlogq zmm0,zmm4,zmm5,11h
vmovdqu32
.
dummy
用 0 替换
vmovdqu32
和:
C5 F1 EF C9 vpxor xmm1,xmm1,xmm1
最佳答案
and a stall
A
或
B
在此之后死了,使用其中一个作为虚拟输入,像这样
__m512i nor_A(__m512i A, __m512i B) {
return _mm512_ternarylogic_epi64(A, A, B, 0x11);
}
A
在,所有 4 个主要的 x86 编译器都为这个简单的情况提供了理想的代码。 (有些将立即数优化为
5
而不是
0x11
,我想使用第一个输入。)
; MSVC 19.24 -O2 -arch:AVX512 -Gv (vectorcall calling convention)
# gcc10/clang10/ICC19 -O3 -march=skylake-avx512
nor_A:
vpternlogq zmm0, zmm0, zmm1, 17
ret
_mm512_undefined_epi32()
是你对你想要的最好的希望 .它安全地表达您想要的内容(任意寄存器),同时避免未定义行为读取未初始化的 C 变量。 (不,IDK 为什么英特尔认为
epi32
比
si512
更有意义,比如
_mm_undefined_si128()
。它没有掩码版本!)
_mm512_setzero_si512
如果他们在内部不真正支持未定义的输入。
Godbolt
zmm0
作为虚拟输入。
__m512i nor_undef(__m512i A, __m512i B) {
return _mm512_ternarylogic_epi64(_mm512_undefined_epi32(), A, B, 0x11);
}
-O2 -arch:AVX512 -Gv
- 不是很好,但基本上没问题,所以相同的源代码可以编译成你想要的 ICC 代码,而不会在任何地方变得糟糕。
__m512i nor_undef(__m512i,__m512i) PROC ; nor_undef, COMDAT
vpxor xmm2, xmm2, xmm2
vpternlogq zmm2, zmm0, zmm1, 17
vmovdqu32 zmm0, zmm2
ret 0
nor_undef:
vmovdqa64 zmm2, zmm0
vpxor xmm0, xmm0, xmm0
vpternlogq zmm0, zmm2, zmm1, 17
ret
nor_undef:
vpxor xmm2, xmm2, xmm2
vpternlogq zmm0, zmm2, zmm1, 5
ret
nor_undef:
vpternlogq zmm0, zmm2, zmm1, 5 #15.12
ret #15.12
关于c++ - 如何指示 MS Visual C++ 编译器使用未初始化的 __m512i 寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62292927/
我是一名优秀的程序员,十分优秀!