找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 224|回复: 8

怎么计算汇编指令的执行时间?

[复制链接]

1

主题

44

回帖

987

积分

用户组: 大·技术宅

UID
7437
精华
0
威望
112 点
宅币
608 个
贡献
110 次
宅之契约
0 份
在线时间
133 小时
注册时间
2021-9-11
发表于 2024-2-26 08:42:34 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
比如说下面2段汇编指令, 如何从理论上论证,哪个执行的周期断?

1:
    movzx eax, WORD Ptr [esp + 0x6]  '' 0FB74424 06
    retn  0x4

2:
    mov  eax, DWORD Ptr [esp + 0x4]   '' 8B4424 04
    Shr  eax, 0x10                    '' C1E8 10
    retn 0x4

回复

使用道具 举报

1111

主题

1651

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24239 个
贡献
46222 次
宅之契约
0 份
在线时间
2297 小时
注册时间
2014-1-26
发表于 2024-2-26 10:09:46 | 显示全部楼层
论证不了。

不同 CPU 架构的流水线处理方式不一样,以及对于相同的指令,不同 CPU 架构执行该指令所需周期不一样。

这些指令前面如果有前置的指令,那么这些前置的指令会对这些指令的实际执行产生影响,比如指令屏障是否存在等。

唯一可以明确的是你提出的第二个例子的指令数量多一条、总的指令字节数多一些,CPU 在内部转换 μ码 的时候存在耗时差异,但是因为实际的 μ码的执行情况会有更大的耗时差异,最终结论还是无法明确的。
回复 赞! 靠!

使用道具 举报

1

主题

44

回帖

987

积分

用户组: 大·技术宅

UID
7437
精华
0
威望
112 点
宅币
608 个
贡献
110 次
宅之契约
0 份
在线时间
133 小时
注册时间
2021-9-11
 楼主| 发表于 2024-2-26 12:14:50 | 显示全部楼层
谢谢! 那只好作死跑循环 测试下哪个快。。。 哈哈
回复 赞! 靠!

使用道具 举报

1111

主题

1651

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24239 个
贡献
46222 次
宅之契约
0 份
在线时间
2297 小时
注册时间
2014-1-26
发表于 2024-2-26 16:51:13 | 显示全部楼层
tlwh163 发表于 2024-2-26 12:14
谢谢! 那只好作死跑循环 测试下哪个快。。。 哈哈

这样做是行不通的,你的代码在某个项目里跑死循环测出来 1 快 2 慢,可能换一个项目就会变成 2 快 1 慢。

正确做法是优先考虑算法优化,然后再考虑硬件设备相关的优化,最后才是汇编指令优化。
回复 赞! 靠!

使用道具 举报

30

主题

211

回帖

2786

积分

用户组: 版主

UID
1821
精华
7
威望
69 点
宅币
2166 个
贡献
206 次
宅之契约
0 份
在线时间
481 小时
注册时间
2016-7-12
发表于 2024-2-26 17:06:42 | 显示全部楼层
计算指令执行速度用rdtsc,执行速度分首次执行和循环执行,两者是有差别的
回复 赞! 靠!

使用道具 举报

1111

主题

1651

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24239 个
贡献
46222 次
宅之契约
0 份
在线时间
2297 小时
注册时间
2014-1-26
发表于 2024-2-27 16:20:32 | 显示全部楼层
AyalaRs 发表于 2024-2-26 17:06
计算指令执行速度用rdtsc,执行速度分首次执行和循环执行,两者是有差别的
...


而且测速时必须锁定使用的 CPU 的特定某个核心才可以,因为不同的 CPU 核心的 tsc 计数是从不同的时间开始的,而 Windows/Linux 等现代操作系统会使用不同的 CPU 核心轮流执行你的程序代码。所以在 Windows 上可以使用以下 API 来指定你要使用的具体的 CPU 核心:

DWORD_PTR SetThreadAffinityMask(
  [in] HANDLE    hThread,
  [in] DWORD_PTR dwThreadAffinityMask
);
https://learn.microsoft.com/en-u ... tthreadaffinitymask

回复 赞! 靠!

使用道具 举报

1

主题

44

回帖

987

积分

用户组: 大·技术宅

UID
7437
精华
0
威望
112 点
宅币
608 个
贡献
110 次
宅之契约
0 份
在线时间
133 小时
注册时间
2021-9-11
 楼主| 发表于 2024-2-27 19:03:39 | 显示全部楼层
本帖最后由 tlwh163 于 2024-2-27 19:06 编辑

ASM
    rdtsc
    push eax
    ....
    rdtsc
    pop edx
    sub eax, edx
    retn
End Asm


是这个样子?
试了下 中间有几条比较简单的指令 得到的结果是 24 。。。

挺稳定的 执行了几次都是24
回复 赞! 靠!

使用道具 举报

65

主题

117

回帖

1万

积分

用户组: 超级版主

OS与VM研究学者

UID
1043
精华
35
威望
789 点
宅币
8304 个
贡献
1094 次
宅之契约
0 份
在线时间
2070 小时
注册时间
2015-8-15
发表于 2024-2-27 23:49:22 | 显示全部楼层
tlwh163 发表于 2024-2-27 19:03
ASM
    rdtsc
    push eax

要先序列化流水线(比如用mfence指令),确保流水线上没有别的指令在执行。
然后rdtsc取开始的tsc,再用rdtscp取结束的tsc。
这是因为rdtsc是直接在rdtsc开始时读取tsc,而rdtscp是等到流水线上在它之前的所有指令完成后才读取tsc。
此外还有考虑供电问题,部分处理器会在低频甚至停转的时候仍然以原速率(即Tsc-Invariant)增加TSC。
更不用提不同处理器拥有不同设计的流水线了。
就算尽可能排除干扰项,它也还只能是测个大概,别太纠结

回复 赞! 靠!

使用道具 举报

30

主题

211

回帖

2786

积分

用户组: 版主

UID
1821
精华
7
威望
69 点
宅币
2166 个
贡献
206 次
宅之契约
0 份
在线时间
481 小时
注册时间
2016-7-12
发表于 2024-2-29 15:27:23 | 显示全部楼层
tangptr@126.com 发表于 2024-2-27 23:49
[md]
要先序列化流水线(比如用`mfence`指令),确保流水线上没有别的指令在执行。
然后`rdtsc`取开始的t ...

以前测试过,单次执行时rdtscp比较可靠,循环执行时同指令的tsc在同工艺不同处理器的数值是一致的,用rdtsc和rdtscp的差值也是固定的,tsc在虚拟机是不准的
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-24 03:42 , Processed in 0.041160 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表