【问题标题】:Writing For loops efficiently高效地编写 For 循环
【发布时间】:2013-02-16 18:30:20
【问题描述】:

我正在用C构造一个函数的偏导数。这个过程主要由大量的小循环组成。每个循环负责填充矩阵的一列。因为矩阵的大小是巨大的,所以代码应该被高效地编写。我有许多实施计划,我不想详细说明。

我知道智能编译器会尝试自动利用缓存。但我想了解更多使用缓存和编写高效代码和高效循环的细节。如果提供一些资源或网站,我将不胜感激,这样我就可以在减少内存访问时间和利用人方面了解更多关于编写有效代码的知识。

我知道我的要求看起来很草率,但我不是计算机专家。我做了一些研究,但没有成功。 因此,感谢您的帮助。

谢谢

【问题讨论】:

标签: c performance caching loops optimization


【解决方案1】:

编写良好的代码往往是高效的(尽管并不总是最优的)。从编写好的干净代码开始,如果您确实有可以隔离和解决的性能问题。

【讨论】:

  • 这绝对不是玩过早优化卡的正确问题类型...
  • @Mystical:你说的,不是我;我只是考虑说出来。 ;-)
  • 看起来你是在暗示它。 :P
【解决方案2】:

您最好以最易读和最易理解的方式编写代码,然后对其进行分析以查看瓶颈的真正位置。很多时候,您对哪里需要效率的概念与现实不符。

现代编译器在优化的许多方面都做得不错,循环过程本身似乎不太可能成为问题。也许您应该考虑专注于简化每个循环所做的计算。

否则,您将查看诸如逐行访问矩阵等内容,以便利用 C 使用的行主要存储顺序(请参阅this question)。

您需要在没有 if 语句的情况下构建您的 for 循环,因为 if 语句会创建所谓的“分支”。计算机基本上会猜测哪个选项是正确的,如果错误,有时会付出高昂的代价。

要扩展该主题,您希望尽可能少地在 for 循环中做任何事情。您还需要使用静态限制来定义它,例如:

for(int i=1;i<100;i++) //This is better than
for(int i=1;i<N/i;i++) //this

静态限制意味着只需花费很少的精力来确定 for 循环是否应该继续运行。它们还允许您使用OpenMP 来划分循环中的工作,这有时可以大大加快速度。这很简单:

#pragma omp parallel for
for(int i=0;i<100;i++)

还有,沃拉!代码是并行化的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 2023-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    相关资源
    最近更新 更多