C++ _mm256_setr_epi32()的延迟和吞吐量
上没有关于_mm256_setr_epi32的延迟和吞吐量的信息。 有人知道它或者知道计算它的方法吗C++ _mm256_setr_epi32()的延迟和吞吐量,c++,intel,latency,avx,throughput,C++,Intel,Latency,Avx,Throughput,上没有关于_mm256_setr_epi32的延迟和吞吐量的信息。 有人知道它或者知道计算它的方法吗 非常感谢 这是英特尔本身未指定的,这里的表C.2复合内在部分提示将有一组指令,具体取决于编译器的输入 在以下情况下,当编译器无法预测输入时,它会根据以下指令进行优化编译: volatile int a = 1, b = 2, c = 3, d = 4, e = 5, f = 6, g = 7, h = 8; 00007FF71DE91013 mov dword
非常感谢 这是英特尔本身未指定的,这里的表C.2复合内在部分提示将有一组指令,具体取决于编译器的输入 在以下情况下,当编译器无法预测输入时,它会根据以下指令进行优化编译:
volatile int a = 1, b = 2, c = 3, d = 4, e = 5, f = 6, g = 7, h = 8;
00007FF71DE91013 mov dword ptr [rbp+1Ch],1
00007FF71DE9101A mov dword ptr [rbp+18h],2
00007FF71DE91021 mov dword ptr [rbp+14h],3
00007FF71DE91028 mov dword ptr [rbp+10h],4
00007FF71DE9102F mov dword ptr [rbp+0Ch],5
00007FF71DE91036 mov dword ptr [rbp+8],6
00007FF71DE9103D mov dword ptr [rbp+4],7
00007FF71DE91044 mov dword ptr [rbp],8
volatile __m256i reg = _mm256_setr_epi32(a,b,c,d,e,f,g,h);
00007FF71DE9104B mov ebx,dword ptr [rbp]
00007FF71DE9104E mov r11d,dword ptr [g]
00007FF71DE91052 mov r10d,dword ptr [f]
00007FF71DE91056 mov r9d,dword ptr [e]
00007FF71DE9105A mov r8d,dword ptr [d]
00007FF71DE9105E mov edx,dword ptr [c]
00007FF71DE91061 mov ecx,dword ptr [b]
00007FF71DE91064 mov eax,dword ptr [a]
00007FF71DE91067 vmovd xmm1,eax
00007FF71DE9106B vpinsrd xmm1,xmm1,ecx,1
00007FF71DE91071 vpinsrd xmm1,xmm1,edx,2
00007FF71DE91077 vmovd xmm0,r9d
00007FF71DE9107C vpinsrd xmm0,xmm0,r10d,1
00007FF71DE91082 vpinsrd xmm0,xmm0,r11d,2
00007FF71DE91088 vpinsrd xmm1,xmm1,r8d,3
00007FF71DE9108E vpinsrd xmm0,xmm0,ebx,3
00007FF71DE91094 vinsertf128 ymm0,ymm1,xmm0,1
00007FF71DE9109A vmovdqu ymmword ptr [rbp+20h],ymm0
但若编译器知道输入,那个么它看起来要短得多
volatile __m256i reg = _mm256_setr_epi32(1,2,3,4,5,6,7,8);
00007FF7789C100F vmovdqu ymm0,ymmword ptr [__ymm@0000000800000007000000060000000500000004000000030000000200000001 (07FF7789C2200h)]
00007FF7789C1017 vmovdqu ymmword ptr [rbp],ymm0
因此,延迟和周期甚至不知道大致情况。在任何情况下,我认为查看汇编程序参考的正确部分是VINSERTI128 description(当前第1670页),如果遵循上面的我的链接,这是英特尔自己未指定的,这里的表C.2复合内在部分提示将有一组指令,具体取决于编译器的输入 在以下情况下,当编译器无法预测输入时,它会根据以下指令进行优化编译:
volatile int a = 1, b = 2, c = 3, d = 4, e = 5, f = 6, g = 7, h = 8;
00007FF71DE91013 mov dword ptr [rbp+1Ch],1
00007FF71DE9101A mov dword ptr [rbp+18h],2
00007FF71DE91021 mov dword ptr [rbp+14h],3
00007FF71DE91028 mov dword ptr [rbp+10h],4
00007FF71DE9102F mov dword ptr [rbp+0Ch],5
00007FF71DE91036 mov dword ptr [rbp+8],6
00007FF71DE9103D mov dword ptr [rbp+4],7
00007FF71DE91044 mov dword ptr [rbp],8
volatile __m256i reg = _mm256_setr_epi32(a,b,c,d,e,f,g,h);
00007FF71DE9104B mov ebx,dword ptr [rbp]
00007FF71DE9104E mov r11d,dword ptr [g]
00007FF71DE91052 mov r10d,dword ptr [f]
00007FF71DE91056 mov r9d,dword ptr [e]
00007FF71DE9105A mov r8d,dword ptr [d]
00007FF71DE9105E mov edx,dword ptr [c]
00007FF71DE91061 mov ecx,dword ptr [b]
00007FF71DE91064 mov eax,dword ptr [a]
00007FF71DE91067 vmovd xmm1,eax
00007FF71DE9106B vpinsrd xmm1,xmm1,ecx,1
00007FF71DE91071 vpinsrd xmm1,xmm1,edx,2
00007FF71DE91077 vmovd xmm0,r9d
00007FF71DE9107C vpinsrd xmm0,xmm0,r10d,1
00007FF71DE91082 vpinsrd xmm0,xmm0,r11d,2
00007FF71DE91088 vpinsrd xmm1,xmm1,r8d,3
00007FF71DE9108E vpinsrd xmm0,xmm0,ebx,3
00007FF71DE91094 vinsertf128 ymm0,ymm1,xmm0,1
00007FF71DE9109A vmovdqu ymmword ptr [rbp+20h],ymm0
但若编译器知道输入,那个么它看起来要短得多
volatile __m256i reg = _mm256_setr_epi32(1,2,3,4,5,6,7,8);
00007FF7789C100F vmovdqu ymm0,ymmword ptr [__ymm@0000000800000007000000060000000500000004000000030000000200000001 (07FF7789C2200h)]
00007FF7789C1017 vmovdqu ymmword ptr [rbp],ymm0
因此,延迟和周期甚至不知道大致情况。在任何情况下,我认为在汇编程序参考中查看的正确部分是VINSERTI128描述,当前第1670页,如果您要了解比从Intel表中获得的吞吐量和延迟更深入的信息,请参见上面的链接有关吞吐量和延迟的详细信息,请参阅《指令表和微阵列指南》。除非考虑到哪些指令竞争同一端口,哪些指令不竞争同一端口,以及前端瓶颈,否则不能只计算往复吞吐量。但无论如何,+1,set_epi*intrinsic的编译方式可能会因上下文的不同而有很大的不同,因此您应该对编译器输出应用静态分析,而不是编译器输入。e、 有时是有用的。有关吞吐量和延迟的更深入的图片,请参阅《指令表和微阵列指南》,而不是从Intel的表中获得的。除非考虑到哪些指令竞争同一端口,哪些指令不竞争同一端口,以及前端瓶颈,否则不能只计算往复吞吐量。但无论如何,+1,set_epi*intrinsic的编译方式可能会因上下文的不同而有很大的不同,因此您应该对编译器输出应用静态分析,而不是编译器输入。e、 g.有时是有用的。