【问题标题】:Latency and Throughput of _mm256_setr_epi32()_mm256_setr_epi32() 的延迟和吞吐量
【发布时间】:2018-12-14 01:45:51
【问题描述】:

intel intrinsics guide 上没有关于 _mm256_setr_epi32() 的延迟和吞吐量的信息。
有谁知道或知道计算它的方法吗?

非常感谢!

【问题讨论】:

    标签: c++ intel latency avx throughput


    【解决方案1】:

    intel 本身未指定,此处https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf 表 C.2 COMPOSITE INTRINSIC 部分提示将有一组指令,具体取决于编译器的输入。

    在以下情况下,当编译器无法预测输入时,它会根据以下指令进行优化:

        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 页)

    【讨论】:

    • 请参阅Agner Fog's 指令表和微架构指南,以获得比英特尔表更深入的吞吐量和延迟图。除非您考虑到哪些指令竞争相同的端口,哪些不竞争,以及前端瓶颈,否则您不能只添加接收吞吐量。 latency vs throughput in intel intrinsics.
    • 但是无论如何,+1,set_epi* 内在函数可以根据上下文进行非常不同的编译,因此您应该将静态分析应用于编译器输出,而不是编译器输入。例如What is IACA and how do I use it? 有时很有用。
    猜你喜欢
    • 2022-12-25
    • 2015-04-16
    • 2021-04-16
    • 2017-11-19
    • 2019-08-27
    • 2016-11-16
    • 2017-03-05
    • 2017-10-29
    • 1970-01-01
    相关资源
    最近更新 更多