English 中文(简体)
硬件灵感循环,胡说?
原标题:Hardware inspired loop. Nonsense?

有一天,我在Verilog学到一个很酷的把戏。 当你需要反复做一些事情时, 您可以使用一个转换注册来计算递增次数。 只是将一个 1 从 LSB 转到 MSB, 当它到达 MSB 时, 您可以重新完成 。

在C中是这样的:

for(j=0b1; !(j & (1<<16)); j=j<<1)
{
/*do a thing 16 times*/
}

I know it has limited use because of the bit width, but it isn t involving any addition so it is fast. So my question: Is there any use of this? Is it worth it to use in C or any other high-level language?

也许在资源有限的嵌入系统中。

谢谢 谢谢

最佳回答

不涉及任何添加,所以速度快

哪些 CPU 结构转换速度比添加速度快? 另外,你为什么认为该特定结构的编译者不会从添加到自动转换的优化,如果这种转换速度更快的话?

这有什么用吗?

为了优化目的,没有使用过它。

就其他目的而言,是的,这种代码通常用于掩盖字节的个别部分。

uint8_t mask; 

f或(mask = 0x01; mask != 0x00; mask<<=1)
{
  do_something (data & mask);
}

f或(i=0; i<8; i++)
{
  do_something (data & (1<<i));
}
问题回答

这是非常“强”不值得的。 它使得代码更清洁,更难阅读,而且性能差异很小。

您的编译器可以比您更好地做这些类型的优化。 这样的短环可能由于性能原因被解开。 但是, 如果您写出这样的循环, 编译器可能无法轻易地解析出来, 因此您甚至可能放慢程序速度 。

这确实是一个微型优化的例子, 几乎肯定永远不会对您的程序运行时间产生显著的影响。

在我看来,大多数评论/回答的人并不真正理解Asker在谈论什么。 Verilog 语言用于硬件设计和硬件设计,与软件设计、没有CPU周期或类似的东西非常不同。然而,简短的回答仍然是:不。 长的回答是:

For sure shifting is MUCH simpler than addition. For shifting there is much less logic from FF (flip flop) to FF. For addition, carry has to be propagated from the LSB bit to the MSB bit, which means log2(N) levels of logic (N is the top value that counter would reach). On the other hand, shift register would use N FFs, while adder would only use log2(N) FFs. So there is a performance / area trade off which also heavily depends on N. Some independent info about adder: http://en.wikipedia.org/wiki/Adder_%28electronics%29 Couldn t find similar article for shifting, but once you understand adder, shifter should be obvious.

当您在RTL 中设计国家机器时, 这可能很重要 。 但您提供的代码实际上与上述内容无关。 用于循环的自动循环意味着所有工作都将在单一周期中完成。 因此, 将会有 N 逻辑。 此循环与执行无关。 它甚至可能只会混淆 Verilog 编译器, 吐出一些奇怪的东西并影响模拟( CPU 周期确实重要, 上面的答案是有效的 ) 。 拥有更多工具经验的人可以对此发表评论 。

(根据Stefan的回答,我假设你是在问Verilog版本所启发的C版,而不是在Verilog中这样做。 )

在许多结构中,这实际上更糟糕,因为位移需要额外的指令,而循环变量的添加是完全自由的。

完全吗?

是的,因为在许多建筑结构中,如果不是零,则有单项指示使一个计数台和分支发生衰减,这些指示需要的时间与任何其他比较和部门指示的时间一样长。而如果您在做一个转换,则需要额外的教学周期。如果您的平台没有“同等和分支”的指示,则情况就更糟了,而不是所有的指示都如此;有些指示使您在两个指令中减去零并比较为零。

即使是在RISC平台上,没有分层分层的分层指令,倒计时环可能更快,因为您可以简单地减去(一个指令)并使用分支5-零指令。而在您的循环中,您需要一个转换(一个指令)和略微明智和(一个指令),然后是分支5-零。假设您甚至有一个分支5-零。

此外,对于简单 for (i= 0; i< N; i++) 环,编译者将其转换为“ 减到 0” 环,如果速度更快的话, 这样做是微不足道的, 你根本不需要自己做那点聪明事 。

在真实的 CPU 中, 添加是您能够做的最快的事情之一; 位移不会更快。 您会让编译者更难优化 。

更快吗? 您确定吗? 至少在MIPS结构上, 一点转变需要的时间和附加时间一样长。 如果最常见的面向消费者的处理器结构不是这样的话, 我会惊讶的。

此外,正如奥莱克西指出的那样,这很难读懂。 可能不值得非同凡响的速度增速。

增殖是一个非常特殊的额外案例。 在大多数处理器中,当然也是大多数RISC处理器中,转换和递增在执行时间是一样的。 事实上,在大多数结构中,添加也不再需要。

当您保留循环代码时, 最优化的软件是 likley, 以简单解开循环, 并使它更快。 如果您将循环机制“ 不寻常 ”, 最优化的软件可能无法优化 。

一般来说, 如果您想要总是循环一定次数的 & gt; 0, 并尽可能减少循环管理, 那么我认为这将是“ 最佳 ” :

unsigned i = 16;

do {
// do something here
} while (--i);



You might get the same result with:

unsigned i = 0x8000;

do {
// do something here
} while (i>>=1);

到那时你就得看看集会了





相关问题
Fastest method for running a binary search on a file in C?

For example, let s say I want to find a particular word or number in a file. The contents are in sorted order (obviously). Since I want to run a binary search on the file, it seems like a real waste ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Tips for debugging a made-for-linux application on windows?

I m trying to find the source of a bug I have found in an open-source application. I have managed to get a build up and running on my Windows machine, but I m having trouble finding the spot in the ...

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

Good, free, easy-to-use C graphics libraries? [closed]

I was wondering if there were any good free graphics libraries for C that are easy to use? It s for plotting 2d and 3d graphs and then saving to a file. It s on a Linux system and there s no gnuplot ...

Encoding, decoding an integer to a char array

Please note that this is not homework and i did search before starting this new thread. I got Store an int in a char array? I was looking for an answer but didn t get any satisfactory answer in the ...

热门标签