再会。
我想请求大家提供处理展开循环剩余物的技巧,但需要注意的是循环相当小,是展开因子的 1-3 倍,例如:
例如。给定 B 的展开因子
int i = 0;
for (; i < N-N%B; i += B) {
...
}
// remainder
for (; i < N; ++i) {
...
}
如果 B 是 2,我可以执行以下操作:
// remainder
if (N%2) {
....
}
但有什么好的方法来处理B>2
Your if (N%2)
可以轻松扩展到任何展开因子:
for (; i < N-B+1; i += B) {
x1; x2; ... xB;
}
if (i < N) {
x1;
if (i < N-1) {
x2;
...
if (i < N-B+2) {
xB;
}}}
对于较小的展开因子,这可能比第二个循环或达夫的设备更有效。
这个版本看起来更好。 gcc 4.6 编译出几乎相同的代码:
if (i++ < N) {
x1;
if (i++ < N) {
x2;
...
if (i++ < N) {
xB;
}}}
如果这个版本可能更优化B
是二的幂。至少 gcc 为其编译了更好的代码。这也绝对是最好的如果N
是一个常数。但如果两者都不是N
是一个常数,也不是B
是 2 的幂,这种方法的优点不是那么明显,因为余数计算效率较低(这通常意味着多条指令,包括乘法):
if (N%B > B-2) {
x1;
if (N%B > B-3) {
x2;
...
if (N%B > 0) {
xB;
}}}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)