gpt4 book ai didi

C 循环优化

转载 作者:行者123 更新时间:2023-11-30 21:03:35 25 4
gpt4 key购买 nike

你们知道如何优化这个循环吗?该数组的大小为 10,000。

int *inlink_num = calloc(npages, sizeof(int))
int **inlink_index = calloc(npages, sizeof(int *));
int *outlink_num = calloc(npages, sizeof(int));

//there is an function to initialize above three variable


for (int i = 0; i < npages; i++)
{
for (int j = 0; j < inlink_num[i]; j++)
{
sum += (store_val[inlink_index[i][j]] / (double) outlink_num[inlink_index[i][j]]);
}

rank_val[i] = constant_part + dampener * sum;
convergence = rank_val[i] - store_val[i];
threshold += (convergence * convergence);
sum = 0.0;
}

请帮忙!

最佳答案

通常的假设是内循环是唯一值得优化的。不幸的是,我们似乎拥有外循环的大小,即 10,000。

如果这种循环的性能足够重要,足以在这里提出问题并花时间查看答案,那么完成前三件事也足够重要。

  1. 基准。假设完成。
  2. 个人资料。找出哪些代码行是性能瓶颈。未完成。
  3. 检查生成的代码。查看编译器生成的内容。未完成。

因此,请编辑您的问题以提供此附加信息。

同时,有 3 种广泛的策略可以提高此类程序的性能。

  1. 更改算法。寻找不同的方法来计算结果和/或使用更多的 CPU 核心。
  2. 帮助编译器。对代码进行一些小的更改,以便编译器可以更好地优化。
  3. 更好地使用CPU。改进缓存局部性和/或更好地选择指令,例如 SIMD。

更多的CPU核心意味着线程。这并不容易,但对于这种类型的代码可能会加速 4 倍。

像 RESTRICT 这样的建议可以帮助编译器检测并避免别名。我的猜测是,这段代码非常简单,编译器不需要帮助。在您查看生成的代码之前您不会知道。

循环核心的指针间接看起来肯定会破坏缓存。是否可以采用不同的数据结构?目标是适合 L2 缓存并具有正确对齐属性的平面多维数组。

这些实际上只是起点。总有一种方法可以让代码运行得更快。如果没有,那就购买更多硬件。

关于C 循环优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23995725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com