286 字
1 分钟
循环展开优化技术

n * n 的循环展开

第一个 n : 表示每次处理几个变量

第二个 n : 表示几个累计变量

原始函数

void combine() {
long i;
long length = vec_length(v);
data_t *d = get_vec_start(v);
data_t t = 1;
for (i = 0; i < length; i++)
t = t * d[i];
*dest = t;
}

4 * 1 路循环, 每次循环处理四个元素, 保存在一个累计变量

void combine41() {
long i;
long length = vec_length(v);
data_t *d = get_vec_start(v);
data_t t = 1;
for (i = 0; i < length - 4; i += 4) {
t = t * d[i];
t = t * d[i + 1];
t = t * d[i + 2];
t = t * d[i + 3];
}
for (; i < length; i++)
t *= d[i];
*dest = t;
}

4 * 4 路循环, 每次循环处理 4 个元素, 保存在 4 个累计变量

void combine44() {
long i;
long length = vec_length(v);
data_t *d = get_vec_start(v);
data_t t = 1;
data_t t1 = 1;
data_t t2 = 1;
data_t t3 = 1;
data_t t4 = 1;
for (i = 0; i < length - 4; i+= 4) {
t1 = t1 * d[i];
t2 = t2 * d[i + 1];
t3 = t3 * d[i + 2];
t4 = t4 * d[i + 3];
}
t = t1 * t2 * t3 * t4;
for (; i < length; i++)
t *= d[i];
*dest = t;
}
循环展开优化技术
https://mizuki.mysqil.com/posts/csapp/循环展开/
作者
Elopez
发布于
2025-10-18
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00