找回密码
 欢迎注册
查看: 6631|回复: 8

[讨论] cache对程序运行效率的影响?

[复制链接]
发表于 2013-8-7 11:08:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
假设有这样的代码:
  1. const int N=512*1024*1024;
  2. int *arr=new int[N];
  3. for (int i = 0; i < N; i += K) arr[i] *= 3;
复制代码
针对不同的K(1<K<1024),该程序会有对应的一个运行时间,这个时间曲线大致是什么样子呢?

我打算写个程序核实一下。

假如不让你写程序,你能给出该曲线的形状吗?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-8-8 12:06:29 | 显示全部楼层
顶起来。
贴出此题的目的只是 期待老大们的回复,然后我能从中学到更多外延的东西
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-8-8 12:50:19 | 显示全部楼层
这个例子不具代表性。K越大,循环次数越少。耗时越短。另外,数组的siz越小,速度越快,因为如果数组的siz小于cache的size,用不了多久,数组的所有元素都被加载到cache中去了,从这往后,所有的内存的访问仅在cache中进行,cache的命中率接近100%。

点评

thanks,我加了一句, arr[64*1024*1024]  发表于 2013-8-8 13:03
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-8-8 13:10:58 | 显示全部楼层
栈的最大值OS是咋限制的,最大可以是多少?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-8-8 17:20:19 | 显示全部楼层
使用malloc应该可以分配大一点的空间,如果在Windows下使用virtualAlloc等命令应该可以分配更加大的内存(还会使用虚拟存储)。
当K不是很大时,CPU会对内存访问顺序访问进行预测,提前转载数据到缓存,所以速度会很快,但是大到一定程度估计预测就失去作用了。于是那时,花费的时间就在访问内存上了

点评

thanks  发表于 2013-8-8 18:24
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-8-8 18:07:08 | 显示全部楼层
mathe 发表于 2013-8-8 17:20
使用malloc应该可以分配大一点的空间,如果在Windows下使用virtualAlloc等命令应该可以分配更加大的内存( ...


恩,我把原题又改了。通过尝试发现,貌似堆上面分配的默认最大值(512*1024*1024*8B =4GB)  不能超过机器的实际内存 (4GB, X86_64),
不然会提示
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc

这是我的测试代码以及机器配置,能编译通过:
  1. /**
  2. \$ uname -a:
  3. Linux wayArch 3.10.5-1-ARCH #1 SMP PREEMPT Mon Aug 5 08:04:22 CEST 2013 x86_64 GNU/Linux

  4. \$ cat /proc/meminfo | grep -e Commit -e Mem
  5. MemTotal: &#160; &#160; &#160; &#160;3805168 kB
  6. MemFree: &#160; &#160; &#160; &#160; 2133448 kB
  7. CommitLimit: &#160; &#160; 1902584 kB
  8. Committed_AS: &#160; &#160;2301428 kB
  9. */

  10. #include<iostream>
  11. using namespace std;
  12. int main()
  13. {
  14.         const int N=512*1024*1024;
  15.         int *arr=new int[N];
  16.         cout<<sizeof(arr)<<endl;
  17.         for(int i=0;i<N;++i){
  18.                 arr[i]=i;       
  19.         }

  20.         /*
  21.         for(int i=0;i<N;++i){
  22.                 cout<<arr[i]<<'\t';
  23.                 if(i%10==9) cout<<endl;
  24.         }
  25.         */
  26.         delete[] arr;

  27. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-8-23 22:07:42 | 显示全部楼层
cache填充是以某个字节倍数为单位连续读取的

所以,一旦你步长超过这个倍数,将会严重受制于cache大小
应该是写会延迟

我手里有本intel的指令优化手册谈到了一个筛法求素数的例子
就是当筛子的步长很大时候,直接写,会遇到写延迟
判定一下反倒速度很快
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-3 11:41 , Processed in 0.059529 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表