为了账号安全,请及时绑定邮箱和手机立即绑定

C循环优化对最终分配的帮助

C循环优化对最终分配的帮助

C
慕田峪9158850 2019-07-17 18:31:17
C循环优化对最终分配的帮助因此,在我的计算机系统类的最后一次作业中,我们需要优化这些循环,使其比原来的更快。在我们的Linux服务器上,基本等级是7秒以下,完整级别是5秒以下。这里的代码大约有5.6秒。我想我可能需要在某种程度上用指针来让它更快,但我不太确定。有人能给我一些建议或选择吗?非常感谢!QUICKEDIT:文件必须保持50行或更少,我忽略了指导员包含的那些注释行。#include <stdio.h>#include <stdlib.h>// You are only allowed to make changes to this code as specified by the comments in it.// The code you submit must have these two values.#define N_TIMES     600000#define ARRAY_SIZE   10000int main(void){     double  *array = calloc(ARRAY_SIZE, sizeof(double));     double  sum = 0;     int     i;     // You can add variables between this comment ...     register double sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0, sum5 = 0, sum6 = 0, sum7 = 0, sum8 = 0, sum9 = 0;     register int j;     // ... and this one.     printf("CS201 - Asgmt 4 - \n");     for (i = 0; i < N_TIMES; i++)     {         // You can change anything between this comment ...         for (j = 0; j < ARRAY_SIZE; j += 10)         {             sum += array[j];             sum1 += array[j + 1];             sum2 += array[j + 2];             sum3 += array[j + 3];             sum4 += array[j + 4];             sum5 += array[j + 5];             sum6 += array[j + 6];             sum7 += array[j + 7];             sum8 += array[j + 8];             sum9 += array[j + 9];         }         // ... and this one. But your inner loop must do the same         // number of additions as this one does.     }                        // You can add some final code between this comment ...     sum += sum1 + sum2 + sum3 + sum4 + sum5 + sum6 + sum7 + sum8 + sum9;     // ... and this one.     return 0;}
查看完整描述

3 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

在此之前,请尝试更改编译器设置以生成更快的代码。有一般的优化,编译器可能会进行自动矢量化。

你要做的就是尝试几种方法,并检查什么是最快的。作为一个目标,尝试达到一个周期每增加或更好。

每个循环的迭代次数:同时加10次和。可能是您的处理器没有足够的寄存器,或者它有更多的寄存器。我会测量4,5,6,7,8,9,10,11,12,13,14.每个循环的总和。

和数:有一个以上和意味着延迟不会咬你,只意味着吞吐量。但超过四六个可能没有帮助。尝试四个和,每个循环有4,8,12,16次迭代。或6和,6,12,18次迭代。

缓存:您正在运行一个80,000字节的数组。可能不止L1缓存。将数组分成2或4个部分。对两个或四个子数组进行外部循环迭代,下一个循环从0到N_倍-1,以及内环加值。

然后您可以尝试使用向量操作,或者多线程您的代码,或者使用GPU来完成这项工作。

如果您被迫使用任何优化,那么“注册”关键字可能实际上是有效的。


查看完整回答
反对 回复 2019-07-17
  • 3 回答
  • 0 关注
  • 777 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信