小编Paq*_*ito的帖子

为什么计算矩阵乘法的时间不是恒定的?

我做了一个执行矩阵乘法的程序(没有优化).

for(i=0; i<a_r; i++)
 for(j=0;j<b_c; j++)
  for(k=0;k<a_c; k++)
   c[i][j]=c[i][j]+a[i][k]*b[k][j];
Run Code Online (Sandbox Code Playgroud)

根据我分配内存的方式,计算时间不同.

重要的是要注意三点:

  • 我只记录计算时间而不记录分配时间(加上分配时间与计算时间相比可忽略不计).
  • 我在计算之前用随机数初始化矩阵.我使用巨大的矩阵(2500 int*2500 int).我选择这个大小来使用RAM内存而不是交换.
  • 如果不使用RAM,这种现象就会消失.

我用三种不同的分配来测试这个程序:

测试1:全局分配

Int a[2500][2500], b[2500][2500], c[2500][2500];
Main {matrix multiplication a*b=c}
Run Code Online (Sandbox Code Playgroud)

计算时间非常稳定(大约41s).

测试2:动态分配(数组)

Main{
int **a,**b,**c;
a=(int **) malloc(sizeof(int)*2500);
for( i=0;i<a_c; i++)
 a[i]=(int *) malloc(sizeof(int)*2500);
…
matrix multiplication a*b=c
}
Run Code Online (Sandbox Code Playgroud)

当我以原始方式多次执行程序时,我获得这些运行时间:260秒,180,110,110 ... 如果我等待大约5秒钟并再次启动程序,我会得到相同的结果.

测试3:动态分配(线)

Main{
int *a, *b, *c;
a=(int *) malloc(sizeof(int)*2500*2500);
… (same for b and c)
matrix multiplication a*b=c
}
Run Code Online (Sandbox Code Playgroud)

计算时间非常稳定(大约44秒).

我认为测试2效率较低,因为数据存储在内存中的方式.就像本文中的解释(网站今天出来)或在这个问题中.通过内存的一些方法更有效,因此一些分配内存的方法可以为您提供更高效的程序.

但是(在测试2中),我不知道为什么程序随着时间的推移会更快.有没有人有想法解释这种现象?提前致谢.

PS我在带有CentOS 6.3和内核Linux …

c memory-management matrix

6
推荐指数
1
解决办法
258
查看次数

如何设置intel_idle.max_cstate = 0来禁用c状态?

我想在我的电脑上禁用c状态.

我在BIOS上禁用了c-state但我没有获得任何结果.但是,我找到了一个解释:"在使用英特尔处理器的系统上,大多数较新的Linux发行版使用"intel_idle"驱动程序(可能已编译到您的内核而不是单独的模块中)来使用C状态.此驱动程序使用各种知识CPU无需系统固件(BIOS)输入即可控制C状态.此驱动程序将忽略任何其他BIOS设置和内核参数"

我找到了两个解决方案来解决这个问题,但我不知道如何申请:

1)"所以如果你想控制C状态,你应该使用内核参数"intel_idle.max_cstate = 0"来禁用这个驱动程序."

我既不知道如何检查(intel_idle.max_cstate)的值,也不知道如何更改其值.

2)"要动态控制C状态,打开文件/ dev/cpu_dma_latency并为其写入最大允许延迟.这将防止使用转换延迟高于指定值的C状态,只要文件/ dev/cpu_dma_latency保持打开状态.写入允许的最大延迟为0将使处理器保持在C0"

我无法读取文件cpu_dma_latency.

谢谢你的帮助.

计算机:Intel Xeon CPU E5-2620 Gnome 2.28.2 Linux 2.6.32-358

kernel linux-kernel

5
推荐指数
1
解决办法
3万
查看次数

标签 统计

c ×1

kernel ×1

linux-kernel ×1

matrix ×1

memory-management ×1