【发布时间】:2013-02-01 04:08:35
【问题描述】:
我有一项任务是优化一段 C 代码(一种我相当讨厌的语言),旨在模拟图像中的旋转像素:
void naive_rotate(int dim, pixel *src, pixel *dst) {
int i, j;
for (i = 0; i < dim; i++)
for (j = 0; j < dim; j++)
dst[RIDX(dim-1-j, i, dim)] = src[RIDX(i, j, dim)];
}
pixel 和 RIDX 的定义如下:
typedef struct {
unsigned short red;
unsigned short green;
unsigned short blue;
} pixel;
#define RIDX(i,j,n) ((i)*(n)+(j))
作业说明包含注释:“您的任务是重写此代码,使其使用代码移动、循环展开等技术尽可能快地运行 并阻止。”
我想我对如何解决这个问题有一些想法。但是,我尝试循环展开:
void rotate_unroll(int dim, pixel *src, pixel *dst) {
int i, j;
for (i = 0; i < dim; i++) {
for (j = 0; j < dim; j+=4) {
dst[RIDX(dim-1-j, i, dim)] = src[RIDX(i, j, dim)];
dst[RIDX(dim-1-(j+1), i, dim)] = src[RIDX(i, j+1, dim)];
dst[RIDX(dim-1-(j+2), i, dim)] = src[RIDX(i, j+2, dim)];
dst[RIDX(dim-1-(j+3), i, dim)] = src[RIDX(i, j+3, dim)];
}
}
}
和代码运动(或至少重新组织 RIDX 并将一些计算移出内部循环):
void rotate_motion(int dim, pixel *src, pixel *dst) {
int i, j;
int dimsquared = dim * dim;
for (i = 0; i < dim; i++) {
int dst_temp = dimsquared - dim + i;
int src_temp = i * dim;
for (j = 0; j < dim; j++) {
dst[dst_temp - (dim * j)] = src[src_temp + j];
}
}
}
// dst[RIDX(dim-1-j, i, dim)]
// = dst[(dim-1-j)dim + i]
// = dst[(dim * dim) - dim - (dim)j + i]
// src[RIDX(i, j, dim)]
// = src[(dim)i + j]
似乎没有工作;与作业打包在一起的计时器声称我的解决方案对程序的 CPE 没有任何影响。我怀疑我可能错误地使用了这两种方法,并且非常感谢任何正确方向的指导。 (这是一个家庭作业,所以我不是要求一个完整的解决方案,只是一些指针。)
我的另一个想法是尝试添加一个累加器——类似于以下内容:
void rotate_acc(int dim, pixel *src, pixel *dst) {
int i, j;
pixel temp = dst;
for (i = 0; i < dim; i++) {
for (j = 0; j < dim; j++) {
temp[RIDX(dim-1-j, i, dim)] = src[RIDX(i, j, dim)];
}
}
dst = temp;
}
但是我的语法非常错误,我不确定如何构建相关结构的临时版本。
非常感谢任何帮助。谢谢!
【问题讨论】:
-
注意:您通常不需要在现实世界中执行此操作。大多数编译器比你更了解如何做这些事情。但是,了解这是如何发生的很有用
-
当你编译它时,确保禁用所有优化 - 不要让编译器“智取”你 :D 另外,检查生成的“汇编”代码。
标签: c optimization