计算 FLOP 次数和数据大小,并检查函数是受内存限制还是受 CPU 限制

标签 c cpu-usage hpc flops

我要分析和优化一些 C 代码,因此我首先必须检查我要优化的函数是受内存限制还是受 CPU 限制。一般来说,我知道如何做到这一点,但我对计算浮点运算和分析所使用的数据大小有一些疑问。看下面的 for 循环,我想分析一下。数组的值是 double (这意味着每个 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。我的意思是,必须加载矩阵的每个条目。计算后,新值将保存到数组的该索引中(现在是 1 个加载和 1 个存储)。但这个值是用于下一步计算的。因此是否需要另一个加载操作,或者这个值(matrix[j*Nt+i-1])是否已经在没有加载操作的情况下可用?

非常感谢!!!

最佳答案

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

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

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

关于计算 FLOP 次数和数据大小,并检查函数是受内存限制还是受 CPU 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16384666/

相关文章:

C - 释放指针数组是否也会释放它们所指向的内容?

php - 这些术语在 Apache Status 中的 CPU 使用率意味着什么?

c - 如何将结构从一个正在执行的程序传递到另一个程序的可执行文件并返回一些字符串

c - 为什么 _do_fork() 的 kretprobe 只返回一次?

android - WebView 在 WebViewCoreThread 后台使用 30%

ios - 如何找出高能和cpu影响的原因?

c - 在 MPI 中发送结构数组

linux - SLURM 中的工作状态

C 代码在 Intel Xeon E5-2650 上的性能

python - 调试 C 程序时如何将 gdb 值转换为 python 数字对象