写入For循环有效

时间:2013-03-02 06:34:06

标签: c performance caching loops optimization

我在C中构造函数的偏导数。该过程主要由大量小循环组成。每个循环负责填充矩阵的列。因为矩阵的大小很大,所以应该有效地编写代码。我对实施有很多计划,我不想详细介绍。

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

我知道我的请求看起来很草率,但我不是电脑人。我做了一些研究但没有成功。 所以,任何帮助都表示赞赏。

由于

2 个答案:

答案 0 :(得分:5)

编写良好的代码往往效率高(虽然并非总是最优)。首先编写好的干净代码,如果实际上存在可以隔离和解决的性能问题。

答案 1 :(得分:2)

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

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

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

你需要构建你的for循环而不用if语句,因为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++)

而且,沃拉!代码是并行化的。