提高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. 尽量减小进入系统内核.
[解决办法]