抱歉,我没有具体解决这个问题。我正在尝试使用系统的固有位并行性。代码的一小部分如下 -
int d;
char ch1;
char ch2;
cin>>ch1>>ch2;
if((d&1) == 0) {
//heavy computation
}
if(ch1 == ch2){
//heavy computation
}
如果设置了lsb,则首先执行条件。 两个'if'条件需要执行多少个时钟周期? 包括以二进制形式转换变量值所需的时钟周期。
答案 0 :(得分:3)
使用任何好的编译器,此问题中显示的if
语句不会消耗执行程序中的任何处理器周期。这是因为编译器会认识到if
语句都不会执行任何操作,无论条件是真还是假,因此在优化期间它们将被删除。
通常,优化可以极大地改变程序。即使if
语句在其子句中有语句,编译器也可以在编译时确定ch1
不等于ch2
,因此不需要在执行期间执行比较程序执行。
除此之外,如果在程序执行期间测试条件,则在评估测试与需要多少处理器周期之间通常没有明确的相关性。现代处理器非常复杂,测试和分支可能会提前推测执行,而其他指令也在执行,因此if
语句根本不会花费任何时间。另一方面,执行分支可能会导致处理器丢弃它准备执行的许多指令并从新的分支目标重新加载新指令,从而使程序花费很多周期。
实际上,对于同一程序中的相同if
语句,这两种效果都可能发生。当if
语句用于具有多次执行的循环时,处理器可以缓存有关分支决策的信息并使用它来加速执行。在另一个时候,当if
语句恰好执行一次(因为循环条件不同)时,缓存的信息可能会误导处理器和成本周期。
答案 1 :(得分:2)
在i386架构上,使用gcc,为abode条件生成的汇编代码是, 条件1:
subl $16, %esp
movb $97, -2(%ebp)
movb $98, -1(%ebp)
movl -12(%ebp), %eax
andl $1, %eax
testl %eax, %eax
jne .L2
条件2:
movzbl -2(%ebp), %eax
cmpb -1(%ebp), %al
jne .L4
为简单起见,我们认为i386是带有RISC内核的MIPS,它可以使用下表: 上述陈述的时钟周期数为18。
实际上当您使用“gcc -S file.c”进行编译时,不会生成2个条件的程序集,因为编译器可能会优先考虑空条件(无效条件或死代码),因此请尝试包含条件中的一些有用的语句,并编译您将获得上述说明的代码。
答案 2 :(得分:0)
您可以编译完整的代码并使用GDB进行反汇编。一旦反汇编,找出你提到的陈述中的数字和类型(Load (5 cycles) Store (4 cycles) Branch (3 cycles) Jump (3 cycles) etc.,)
。这些周期的总和导致消耗的时钟周期。但这取决于您使用的处理器。
答案 3 :(得分:0)
通过查看你的问题,我认为你需要计算你的陈述执行的指令数,然后计算你的if中每条指令的周期
代码:
if(x == 0)
{
x = 1;
}
x++;
这将消耗以下指令数
mov eax, $x
cmp eax, 0
jne end
mov eax, 1
end:
inc eax
mov $x, eax
所以首先if语句将消耗 2cpu周期
添加到您的特定代码
cin>>ch1>>ch2;
if((d&1) == 0) {
//heavy computation
}
if(ch1 == ch2){
//heavy computation
}
你需要在这两个if else操作中获得所需的指令,从中可以计算周期。 你还需要在if语句的主体中添加一些内容(if(){body}),否则现代编译器会智能删除你的代码,因为它是死代码。
答案 4 :(得分:0)
这取决于您的“中频”。
最简单的情况是要比较两个字节,一条指令中可能只需要2个时钟周期即可。 1111 0001,这意味着(第一)激活ALU-CMP并将数据从R0设置到TMP; (2)将R1传送到总线上并将输出设置为ACC。
否则,您至少需要其他3个时钟来进行读取,1个时钟来检查I / O中断以及1个最终时钟来重置指令寄存器。
因此,在电路规模上,只需7个时钟周期即可执行2个字节的“ IF”。但是,您永远不会只写“ IF”来比较两个数字(由两个字节表示),不是吗? ?