微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

更好地理解时序和流水线

如何解决更好地理解时序和流水线

在这代码中,我只是循环了一系列指令。不考虑次数(100、1000、1000000),使用 RDTSC 的时序显示输出)循环的 6 个时钟周期。我在咖啡湖 I9-9900K

循环中有 13 条指令 - 我原以为最小的 RDTSC 增量是 13。

有人能告诉我这似乎比我预期的快两倍吗?我显然误解了一些基本的东西,或者我犯了一个荒谬的错误

谢谢!

    rng.SetFloatScale(2.0f / 8.0f);
00C010AE  vmovups     ymm4,ymmword ptr [__ymm@3e0000003e0000003e0000003e0000003e0000003e0000003e0000003e000000 (0C02160h)]  

    Vec8f sum = 0;
    const size_t loopLen = 1000;

    auto start = __rdtsc();
00C010BB  rdtsc  
00C010BD  mov         esi,eax  
        sum += rng.NextScaledFloats();
00C010F0  vpslld      ymm0,ymm2,xmm5  
00C010F4  vpxor       ymm1,ymm0,ymm2  
00C010F8  vpsrld      ymm0,ymm1,xmm6  
00C010FC  vpxor       ymm1,ymm1  
00C01100  vpslld      ymm0,xmm7  
00C01104  vpxor       ymm2,ymm1  
00C01108  vpand       ymm0,ymmword ptr [__ymm@007fffff007fffff007fffff007fffff007fffff007fffff007fffff007fffff (0C02140h)]  
00C01110  vpor        ymm0,ymmword ptr [__ymm@4000000040000000400000004000000040000000400000004000000040000000 (0C021A0h)]  
00C01118  vmovups     ymm1,ymm4  
00C0111C  vfmsub213ps ymm1,ymmword ptr [__ymm@3e8000003e8000003e8000003e8000003e8000003e8000003e8000003e800000 (0C02180h)]  
00C01125  vaddps      ymm3,ymm3  
    for (size_t i = 0; i < loopLen; i++)
00C01129  sub         eax,1  
00C0112C  jne         main+80h (0C010F0h)  
    auto end = __rdtsc();
00C0112E  rdtsc  
00C01130  mov         edi,eax  
00C01132  mov         ecx,edx  

    printf("\n\nAverage: %f\nAverage RDTSC: %ld\n",fsum,(end - start) / loopLen);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。