0

我将分析和优化一些 C 代码,因此我首先必须检查我要优化的函数是内存绑定的还是 CPU 绑定的。一般来说,我知道如何做到这一点,但我对计算浮点运算和分析使用的数据大小有一些疑问。看下面我要分析的for循环。数组的值是双精度的(这意味着每个 8 字节):

for(int j=0 ;j<N;j++){
    for(int i=1 ;i<Nt;i++){
        matrix[j*Nt+i] = matrix[j*Nt+i-1] * mu + matrix[j*Nt+i]*sigma;
    }
}

1)你数了多少浮点运算?我考虑过 3*(Nt-1)*N... 但我是否也必须计算数组中的操作(矩阵 [j*Nt+i],对于这个数组来说还有 2 个 FLOP)?

2)传输了多少数据?2* ((Nt-1)*N) 8Byte 或 3 ((Nt-1)*N)*8Byte。我的意思是,必须加载矩阵的每个条目。计算后,新值将保存到数组的该索引(现在是 1load 和 1 store)。但是这个值是用于下一次计算的。因此是否需要另一个加载操作,或者这个值 (matrix[j*Nt+i-1]) 在没有加载操作的情况下是否已经可用?

多谢!!!

4

1 回答 1

0

使用这种类型的代码,您建议进行的直接分析几乎完全是误导性的。关于代码性能的唯一有意义的信息实际上是测量它在实践中的运行速度(基准测试)。

这是因为现代编译器和处理器在优化这样的代码方面非常聪明,它最终将以一种与您直接分析完全不同的方式执行。编译器将优化代码,重新排列各个操作。处理器本身将尝试并行和/或流水线执行各个子操作,以便例如在从内存中获取数据时进行计算。

考虑算法复杂性,区分 O(n) 和 O(n²) 等等是很有用的,但是常数因子(比如你问的 2*... 或 3*...)完全没有实际意义,因为它们会有所不同在实践中取决于很多细节。

于 2014-09-05T19:21:57.333 回答