首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

拔高cache命中率有经验的请指导

2012-10-15 
提高cache命中率有经验的请指导。编程对汉语语句进行语法分析,测试文件语句数量: 398002,文件大小9m硬件是:

提高cache命中率有经验的请指导。
编程对汉语语句进行语法分析,测试文件语句数量: 398002,文件大小9m

硬件是:双 E5-2670 cpu ;每cpu 八核,16线程(任务管理器每cpu显示16个小核,共32个小核)

内存32G,实际使用仅7G。

omp_set_num_threads设置线程数量

#pragma omp for schedule(static,80)//给分配工作量

一、SetThreadAffinityMask绑定;


线程数量:1,执行用时 128732秒 绑定0核(任务管理器显示绑定)

线程数量:2,执行用时 110043秒 绑定0-1核(任务管理器显示绑定)

线程数量:4,执行用时 111837秒 绑定0-3核(任务管理器显示绑定)

线程数量:8,执行用时 142554秒 绑定0-7核(任务管理器显示绑定)

线程数量:16,执行用时 205469秒 绑定0-15核(任务管理器显示绑定)


二、不绑定;

线程数量:1,执行用时 122726秒 不设绑定

线程数量:2,执行用时 99654秒 不设绑定

线程数量:4,执行用时 114239秒 不设绑定

线程数量:8,执行用时 156469秒 不设绑定

线程数量:16,执行用时 236576秒 不设绑定


运行最快竟然是2线程,如何解释?


用VTune发现 4线程是 L2 replacement 是 45% ,这个词语是命中率 还是 失效率?

不管怎样,都很低了。 

如何优化?

请有经验的朋友,告知一些资料。



[解决办法]
多线程要提高性能至极限, 遵守的规则有:
1. 线程资源相互独立
2. 减少FAR访问形式, 简单点, 尽量在线程的栈里面分配所需要用到的空间. 访问一个全局变量跟访问栈变量的速度是有很大区别的.
3. 减小new和delete, 或者直接不使用
4. 线程之间不能够访问相邻的数据, 例如a[8], 然后每个线程访问固定一个下标来访问, 并且存在写操作, 这样会使效率暴降, 除非把a的数据类型是按CPU的cacheline大小定义的.
5. 数据的分布必须尽可能的按访问顺序来定义, 让CPU减小跳转, 跨区转跳会让CPU重新读取一个Cacheline, 同样效率会暴降.
6. 尽量减小进入系统内核.
[解决办法]

探讨
多线程要提高性能至极限, 遵守的规则有:
1. 线程资源相互独立
2. 减少FAR访问形式, 简单点, 尽量在线程的栈里面分配所需要用到的空间. 访问一个全局变量跟访问栈变量的速度是有很大区别的.
3. 减小new和delete, 或者直接不使用
4. 线程之间不能够访问相邻的数据, 例如a[8], 然后每个线程访问固定一个下标来访问, 并且存在写操作, 这样会使效率暴降, 除非把a的数据……

[解决办法]
深入理解计算机系统
整本书
概括起来
就是按照存储金字塔展开的

[解决办法]
#pragma omp for schedule(static,80)//给分配工作量

又见楼主,一直感觉这个工作量分配有猫腻。偶去研究下
[解决办法]
1 不一定线程越多速度越快,要考虑整个架构的结构

2 cache命中和物理cpu属性以及OS底层数据缓存相关,在某种架构下优化很好,换
一种架构可能糟糕之极

3 最后实践决定一切

热点排行