False Sharing问题
2015-07-30 10:25
519 查看
转自:http://blog.csdn.net/pennyliang/article/details/5766541
在多处理器,多线程情况下,如果两个线程分别运行在不同的CPU上,而其中某个线程修改了cache line中的元素,由于cache一致性的原因,另一个线程的cache line被宣告无效,在下一次访问时会出现一次cache line miss,哪怕该线程根本无效改动的这个元素,因此出现了False Sharing问题【1】。
如下图所示,thread1修改了memory灰化区域的第[2]个元素,而Thread0只需要读取灰化区域的第[1]个元素,由于这段memory被载入了各自CPU的硬件cache中,虽然在memory的角度这两种的访问时隔离的,但是由于错误的紧凑地放在了一起,而导致了,thread1的修改,在cache一致性的要求下,宣告了运行Thread0的CPU0的cache line非法,从而出现了一次miss,导致从小从memory中读取到cache line中,而一致性的代价付出了,但结果并不是thread0所care的,导致了效率的降低。关于实验可以参考[2]。
因此在多核编程情况下,要特别注意False Sharing问题。
解决的方法可以是:详细参见【1】
__declspec (align(64)) int thread1_global_variable;
__declspec (align(64)) int thread2_global_variable;
或者是
struct ThreadParams
{
// For the following 4 variables: 4*4 = 16 bytes
unsigned long thread_id;
unsigned long v; // Frequent read/write access variable
unsigned long start;
unsigned long end;
// expand to 64 bytes to avoid false-sharing
// (4 unsigned long variables + 12 padding)*4 = 64
int padding[12];
};
__declspec (align(64)) struct ThreadParams Array[10];
【1】http://software.intel.com/en-us/articles/avoiding-and-identifying-false-sharing-among-threads/
【2】http://www.codeproject.com/KB/threads/FalseSharing.aspx
在多处理器,多线程情况下,如果两个线程分别运行在不同的CPU上,而其中某个线程修改了cache line中的元素,由于cache一致性的原因,另一个线程的cache line被宣告无效,在下一次访问时会出现一次cache line miss,哪怕该线程根本无效改动的这个元素,因此出现了False Sharing问题【1】。
如下图所示,thread1修改了memory灰化区域的第[2]个元素,而Thread0只需要读取灰化区域的第[1]个元素,由于这段memory被载入了各自CPU的硬件cache中,虽然在memory的角度这两种的访问时隔离的,但是由于错误的紧凑地放在了一起,而导致了,thread1的修改,在cache一致性的要求下,宣告了运行Thread0的CPU0的cache line非法,从而出现了一次miss,导致从小从memory中读取到cache line中,而一致性的代价付出了,但结果并不是thread0所care的,导致了效率的降低。关于实验可以参考[2]。
因此在多核编程情况下,要特别注意False Sharing问题。
解决的方法可以是:详细参见【1】
__declspec (align(64)) int thread1_global_variable;
__declspec (align(64)) int thread2_global_variable;
或者是
struct ThreadParams
{
// For the following 4 variables: 4*4 = 16 bytes
unsigned long thread_id;
unsigned long v; // Frequent read/write access variable
unsigned long start;
unsigned long end;
// expand to 64 bytes to avoid false-sharing
// (4 unsigned long variables + 12 padding)*4 = 64
int padding[12];
};
__declspec (align(64)) struct ThreadParams Array[10];
【1】http://software.intel.com/en-us/articles/avoiding-and-identifying-false-sharing-among-threads/
【2】http://www.codeproject.com/KB/threads/FalseSharing.aspx
相关文章推荐
- Java unicode 转中文
- Python之集合(set)
- 模板方法模式-Template Pattern
- RAC环境下配置OGG同步
- cocos2d-x AnchorPoint锚点
- Google推荐的图片加载库Glide介绍
- 干货:强化商业模式的七种机制
- SQL SERVER 2008 R2 远程备份数据库
- hdu3591The trouble of Xiaoqian 多重背包+完全背包
- EJB学习(三)——java.lang.ClassCastException: com.sun.proxy.$Proxy2 cannot be cast to..
- codevs contest #1 3944 幻影阁的难题 树形DP+二分
- 【android】WebView缓存数据收集
- Python之集合(set)
- jquery+php实现用户输入搜索内容时自动提示
- [bfs] HDU2102 A计划
- IP报文格式学习笔记
- Input标签和图片按钮水平对其
- Android自动化测试工具汇总
- 观察者设计模式
- OC文件操作、获取文件属性