如何解决更好地理解时序和流水线
在这段代码中,我只是循环了一系列指令。不考虑次数(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 举报,一经查实,本站将立刻删除。