我做了一个执行矩阵乘法的程序(没有优化).
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)
根据我分配内存的方式,计算时间不同.
重要的是要注意三点:
我用三种不同的分配来测试这个程序:
测试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状态.
我在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