我正在做一个家庭作业,我必须手动优化嵌套循环(我的程序将在禁用优化的情况下编译).分配的目标是在不到6秒的时间内运行整个程序(额外的功劳少于4.5秒).
我只允许更改一小段代码,起点是这样的:
for (j=0; j < ARRAY_SIZE; j++) {
sum += array[j];
}
Run Code Online (Sandbox Code Playgroud)
哪里ARRAY_SIZE是9973.这个循环被包含在运行20万次到另一个循环中.此特定版本在16秒内运行.
到目前为止我所做的是更改实现以展开循环并使用指针作为我的迭代器:
(这些声明不超过200,000次)
register int unroll_length = 16;
register int *unroll_end = array + (ARRAY_SIZE - (ARRAY_SIZE % unroll_length));
register int *end = array + (ARRAY_SIZE -1);
register int *curr_end;
curr_end = end;
while (unroll_end != curr_end) {
sum += *curr_end;
curr_end--;
}
do {
sum += *curr_end + *(curr_end-1) + *(curr_end-2) + *(curr_end-3) +
*(curr_end-4) + *(curr_end-5) + *(curr_end-6) + *(curr_end-7) +
*(curr_end-8) + …Run Code Online (Sandbox Code Playgroud)