一个关于指令执行时间的问题(整形或者浮点运算)

lk_517 2008-03-27 05:59:54
不知道发这里合适不,先发吧。大家先看这个程序

int main() {
int i;
int sum1, sum2, sum3, sum4, sum5, sum6, sum7, sum8;
sum1 = 0;
sum2 = 0;
sum3 = 0;
sum4 = 0;
sum5 = 0;
sum6 = 0;
sum7 = 0;
sum8 = 0;

for (i = 0; i < ITER; i++) {
sum1 = sum1 + 2;
sum2 = sum2 + 2;
sum3 = sum3 + 2;
sum4 = sum4 + 2;
sum5 = sum5 + 2;
sum6 = sum6 + 2;
//sum7 = sum7 + 2;
//sum8 = sum8 + 2;
}
printf("%d\n", sum1);
return 0;
}

需要说明是编译指令gcc xxx.c -DITER=1000000000 -O0 -o xxx,无任何优化,测试平台ubuntu7.10,时间测试使用time命令。

大家可以看到,for循环中有8条加指令,我现在希望在某个硬件平台上测试,在操作指令数的递增情况下,程序耗费时间是一个什么关系。下面是我在IBM T43上的测试结果

1(就是for中只有一条 sum1 = sum1 + 2;下同):4.xx s
2 4.xx s
3 6.xx s
4 6.xx s
5 8.xx s
6 6.xx s
7 7.xx s
8 9.xx s

OK,我在别的平台上也测试过,具体秒数肯定不一样,但是变化都是毫无规律,大小不一。

我将程序转换成汇编看过,每多一条指令就多一条对应的addl指令,其他没有任何变化

所以,我的问题是,这个无规律执行时间是不是和CPU内部架构,比如加法器数量,分配机制之类的有关?还是可能time命令测试不一定准备?for循环中的操作都是无依赖操作。但是不管怎么和加法器有关,我也不理解为什么有时候操作指令多了,反而时间还减少了?浮点数结果更甚,我就不贴上来了。

希望明白的朋友赐教,多谢。
...全文
762 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
suyouxin 2008-03-31
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 lk_517 的回复:]
q6600四核是扣肉,所以是14级流水

ls能不能大概说一下,怎么根据“几条指令内有无重复使用寄存器”推算可用流水深度?我能知道的就是对寄存器的使用,这八条是一样的。

如果大家都使用同样的寄存器(不管寄存器是不是重复),也会出现有时流水跑起来有时流水没跑起来的情况么?
[/Quote]

复杂的四核CPU我没有用过,但从单核的原理上比较怀疑是流水线跑起来了导致了速度加快,可以通过增加指令之间的相关性来抑制流水线工作,如果在确认流水线没有工作起来的情况下得到的测试结果也是这个样就可以排除是流水线进行的加速。

“几条指令内有无重复使用寄存器”,是想说在几条指令里如果都重复使用相同的一个寄存器,指令之间的相关性会导致流水线工作不起来,如果这个问题是因为流水线影响的速度,那么让它跑不起来也许就可以得到你想要的线性增长的时间结果,如果还是你现在的结果,就可以排除是流水线的问题。
lunarfan 2008-03-31
  • 打赏
  • 举报
回复
mark
lk_517 2008-03-31
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 suyouxin 的回复:]
引用 30 楼 lk_517 的回复:
q6600四核是扣肉,所以是14级流水

ls能不能大概说一下,怎么根据“几条指令内有无重复使用寄存器”推算可用流水深度?我能知道的就是对寄存器的使用,这八条是一样的。

如果大家都使用同样的寄存器(不管寄存器是不是重复),也会出现有时流水跑起来有时流水没跑起来的情况么?


复杂的四核CPU我没有用过,但从单核的原理上比较怀疑是流水线跑起来了导致了速度加快,可以通过增加指令之间的…
[/Quote]

虽然是4核,但是在这里完全是当作单核考虑的,因为他不会将这种单线程任务分配到4核上的。

OK,我来确认一下,你的意思是从第六条开始,可能出现了流水线跑起来的情况?

说老实话,我不是很清楚这种情况的程序在什么条件下被流水所分解,我的理解是只要能分解,应该是都会分解的......
ydlchina 2008-03-31
  • 打赏
  • 举报
回复
up
lk_517 2008-03-30
  • 打赏
  • 举报
回复
q6600四核是扣肉,所以是14级流水

ls能不能大概说一下,怎么根据“几条指令内有无重复使用寄存器”推算可用流水深度?我能知道的就是对寄存器的使用,这八条是一样的。

如果大家都使用同样的寄存器(不管寄存器是不是重复),也会出现有时流水跑起来有时流水没跑起来的情况么?
lk_517 2008-03-30
  • 打赏
  • 举报
回复
预处理的过程包括哪些?
Skt32 2008-03-30
  • 打赏
  • 举报
回复
应该是运算消耗+管理消耗
Skt32 2008-03-30
  • 打赏
  • 举报
回复
应该是有什么预处理波动现象。

在侦测到需要进行预处理的时候,由于同时多了预处理的操作,时间消耗向上波动;
在预处理已经做了的情况下,时间消耗向下波动。

1 4.xx s
2 4.xx s
3 6.xx s
4 6.xx s // 平
5 8.xx s // 预处理 跳高
6 6.xx s // 跳低
7 7.xx s //
8 9.xx s // 预处理 跳高


abupie 2008-03-28
  • 打赏
  • 举报
回复
双核做怪?
lk_517 2008-03-28
  • 打赏
  • 举报
回复
数据就是user time

而且我测试的时候基本是不开别的程序,sys time都超级少
suyouxin 2008-03-28
  • 打赏
  • 举报
回复
看看你的CPU的说明,流水线的深度是多少?
再看看这几条指令使用的加法器等有没有冲突

再看你的汇编代码,包括寄存器的使用,在几条指令内有无重复使用寄存器,推算流水线可以跑到多少深度?重点看看中间时间下降的那种情况,看是不是流水线跑起来了导致速度变快,可以调调顺序,使用重复的寄存器确认是不是流水线加快的速度
野男孩 2008-03-28
  • 打赏
  • 举报
回复
哦~看错了,不是那种循环展开优化。

不过你这个问题跟你分不分到双核仍然没关系,即使是单核的,也有多条流水线来优化。

循环中的各语句没有依赖关系,所以能够靠多条流水线并发计算。受流水线和cache资源的限制,显然也有个上限,所以速度不可能无限增加。

lz看看Computer System - A Programer's Perspective这本书吧,还有Inter优化手册,应该会有些帮助
野男孩 2008-03-28
  • 打赏
  • 举报
回复
哦~看错了,不是那种循环展开优化。

不过你这个问题跟你分不分到双核仍然没关系,即使是单核的,也有多条流水线来优化。

循环中的各语句没有依赖关系,所以能够靠多条流水线并发计算。受流水线和cache资源的限制,显然也有个上限,所以速度不可能无限增加。

lz看看Computer System - A Programer's Perspective这本书吧,还有Inter优化手册,应该会有些帮助
lk_517 2008-03-28
  • 打赏
  • 举报
回复
1 我肯定不是误差,在q6600四核处理器上也是毫无规律,在我的Centrino上也是这样

2 基本判断可能和指令发射,融合这种过程中有关,至于具体什么关系,天知道......


继续期待高人。
allanqyz 2008-03-28
  • 打赏
  • 举报
回复
这个..其实 我真的很迷糊,关注中
qiuqiu173 2008-03-28
  • 打赏
  • 举报
回复
关注
舉杯邀明月 2008-03-28
  • 打赏
  • 举报
回复
太底层的东西,不明白..........
qmm161 2008-03-28
  • 打赏
  • 举报
回复
在arm上可能也跑得是ce,但是不会有那么多用户进程,所以影响没那么明显吧!

猜测,猜测...
qmm161 2008-03-28
  • 打赏
  • 举报
回复
在本本上测有点误差应该也很正常,我是这样想的,windows本来就是多进程的,可能在运行这个程序的时候你电脑里安装的杀毒软件突然抽了一下,时间就多了点!
yananguo_1985 2008-03-28
  • 打赏
  • 举报
回复
指令执行时间,关注中..
加载更多回复(17)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧