2

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

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

我知道我的要求看起来很草率,但我不是计算机人。我做了一些研究,但没有成功。因此,任何帮助表示赞赏。

谢谢

4

2 回答 2

5

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

于 2013-03-02T06:36:46.497 回答
2

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

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

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

您将希望在内部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++)

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

于 2013-03-02T06:38:07.697 回答