c++ - 如何计算 C++ 代码片段的 CPU 周期成本?

标签 c++ memory

<分区>

比如说,我有一台假设的机器:Hypothetical Von-Neumann .

图像是这样说的:

  • 缓存为 1 kB,获取 1 个 float (8 字节)的成本为 1 个 CPU 周期。
  • 如果代码所需的数据不在缓存中,则以 150 个 CPU 周期为代价从 RAM(10MB) 中取出 1kB 数据。

现在,给定这台机器。我想知道计算代码片段的 CPU 周期成本的细节/规则。作为示例,请使用此代码,其中 A 是一个 1024x1024 int 矩阵并且已使用整数初始化:

#define N 1024
sum=0;

for(i=0;i<N;i++)
{
    for(j=0;j<N;j++) 
        sum+=A[i][j];
}
  1. 我该如何计算编号。获取矩阵 A 的数据所需的 CPU 周期数?我是 对于矩阵 A 将如何从主内存中获取感到困惑。我不是在寻找确切的答案,只是想知道解决问题的过程。我不完全确定代码如何使用各种内存。

例如,当i = 0j = 0 时(第一次迭代),A 将从主内存调用,对吗?那么这是否意味着 1 kB 的数据从主内存传输到高速缓存或仅 4 字节,因为该元素只是一个整数?指令或操作的内存又如何呢?只是对这个感到困惑。

  1. 如果我用上面的 A[j][i] 替换 A[i][j] 会怎么样?
  2. 此外,如果用 FORTRAN 编写完全相同的代码,会有什么不同?

编辑:我只想知道如何计算仅获取矩阵 A 数据的 CPU 周期。

最佳答案

假设 32 位 int 并且除了实际使用缓存之外没有优化

  1. 我该如何计算编号。需要多少 CPU 周期? 我对如何从主内存中获取数组 A 感到困惑。

A 是一个 2 维数组,看起来像提到的 1 维数组 here :

int array1[2][2] = {{0, 1}, {2, 3}};

在内存中是这样的:

0 1 2 3

因此,当 CPU 尝试执行 sum += A[i][j] 时,它会以 150 个 CPU 周期为代价从内存中获取 1 KB 并将其写入缓存。此操作第一次发生是在 i=j=0 时,因此从该位置开始的 1 KB 整数(假设为 32 位整数)是 2^8 整数(基本上是 A[0] [0-255] 第一个元素)。

现在,每次添加 sum += A[i][j] 都是通过转到缓存并使用写入那里的内存来完成的(还有一个时间来检查数据是否是是否在缓存中,但由于您没有在问题中提及它,所以从现在开始我会做同样的事情)

因此,长话短说,您只需在 150 个周期内将 1 KB 放入缓存中,然后您可以在每个周期内从中读取另外 255 个(再次假设为 32 位整数)整数int(第一个已经从内存中读取)

  1. 如果我用上面的 A[j][i] 替换 A[i][j] 会怎么样?

坏的,坏的事情会发生。此操作将使缓存生产力无效,因为每次您将获取一个新的 int 时,您会发现它不在缓存中,您将不得不从内存中获取它(再次 150 个周期。再次 :( )

关于c++ - 如何计算 C++ 代码片段的 CPU 周期成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34967000/

相关文章:

c++ - 访问对象的变量减慢程序 (C++)

c++ - 在使用 auto 时初始化结构会导致 VS 2013 中的拷贝

c - 如何在我的 C 程序中正确分配内存?

c++ - Linux 进程文件包含哪些内容?

java - 使用共享首选项在 EditText 中保存数字

c++ - 使用 CString 在 C++ 中重复一个字符不同次数

c++ - 而(p = strtok(NULL ,","))警告:possible incorrect assignment

calloc 返回指向自身的指针

javascript - JavaScript Array 的内存管理

c++ - 如何将 OpenGL 绘图分成类