对于名为“高性能计算”的课程的作业,我需要优化以下代码片段:
int foobar(int a, int b, int N)
{
int i, j, k, x, y;
x = 0;
y = 0;
k = 256;
for (i = 0; i <= N; i++) {
for (j = i + 1; j <= N; j++) {
x = x + 4*(2*i+j)*(i+2*k);
if (i > j){
y = y + 8*(i-j);
}else{
y = y + 8*(j-i);
}
}
}
return x;
}
使用一些建议,我设法优化了代码(或者至少我是这么认为的),例如:
- 不断传播
- 代数简化
- 复制传播
- 公共子表达式消除
- 死代码消除
- 循环不变量去除
- 按位移位而不是乘法,因为它们更便宜。
这是我的代码:
int foobar(int a, int b, int N) {
int i, j, x, y, t;
x = 0;
y = 0;
for (i = 0; i <= N; i++) {
t = i + 512;
for (j = i + 1; j <= N; j++) {
x = x + ((i<<3) + (j<<2))*t;
}
}
return x;
}
根据我的导师的说法,一个经过良好优化的代码指令在汇编语言级别应该有更少或更少成本的指令。因此必须运行,指令比原始代码更短的时间,即计算是用:
执行时间 = 指令数 * 每条指令的周期数
当我使用命令生成汇编代码时:gcc -o code_opt.s -S foobar.c
,
尽管进行了一些优化,但生成的代码比原始代码行数多,运行时间更低,但没有原始代码那么多。我究竟做错了什么?
不要粘贴汇编代码,因为两者都非常广泛。所以我在 main 中调用函数“foobar”,我正在使用 linux 中的 time 命令测量执行时间
int main () {
int a,b,N;
scanf ("%d %d %d",&a,&b,&N);
printf ("%d\n",foobar (a,b,N));
return 0;
}