处理展开的循环余数

2024-02-19

再会。

我想请求大家提供处理展开循环剩余物的技巧,但需要注意的是循环相当小,是展开因子的 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(使用前将#替换为@)

处理展开的循环余数 的相关文章

随机推荐