gpt4 book ai didi

c - 为什么 nop 不占用一个时钟周期

转载 作者:行者123 更新时间:2023-11-30 14:32:42 34 4
gpt4 key购买 nike

我编写了一个基本代码来找出 nop 占用的时钟周期数。我们知道 nop 需要一个时钟周期。

#include <stdio.h>
#include <string.h>
#include <stdint.h>


int main(void)
{
uint32_t low1, low2, high1, high2;
uint64_t timestamp1, timestamp2;
asm volatile ("rdtsc" : "=a"(low1), "=d"(high1));
asm("nop");
asm volatile ("rdtsc" : "=a"(low2), "=d"(high2));
timestamp1 = ((uint64_t)high1 << 32) | low1;
timestamp2 = ((uint64_t)high2 << 32) | low2;
printf("Diff:%lu\n", timestamp2 - timestamp1);
return 0;
}

但是输出不是1。

有时是 14 或 16。

我可以知道这背后的原因吗?我错过了什么吗

最佳答案

We know nop takes one clock cycle.

现代 CPU 可以被认为是一个阶段的管道;其中前端可能并行获取和解码多个指令,并将生成的微操作放入缓冲区中,等待满足其依赖性(在被执行单元获取之前,其中可以在执行单元处执行多个微操作)多个执行单元同时执行)。

NOP 没有微操作 - 它只是被前端丢弃。不需要 1 个周期。

But the output is not 1.

编译器生成的指令可能需要 14 或 16 个周期来处理第​​一个 rdtsc 的输出,然后为第二个 rdtsc 做好准备,然后是第二个 rdtsc 本身。

请注意,rdtsc 可能会计算固定频率计时器的周期,该计时器与 CPU 当前(可变)时钟频率无关;因此 14 或 16 个“时间周期”可能是(例如)7 或 8 个 CPU 周期。

关于c - 为什么 nop 不占用一个时钟周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59700183/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com