我已经尝试根据/ proc / cpuinfo确定我的应用程序的处理器关联规则,我的redhat Linux showes
processor : 0 to 47 , means server has 48 processor unit
physical id : 0 to 3 , means server has 4 cpu sockets
cpu cores : 6 , means each socket has 6 cores
siblings : 12 , means each core has 2 hyperthreads
总而言之,这台服务器有4 * 6 * 2 = 48个处理器单元,到目前为止我是否正确?
我喜欢做的是使用sched_setaffinity函数,首先我想知道的是 同一核心中的超线程,例如......
processor 0 : physical id:0,core id: 0 ...
processor 24 : physical id:0,core id: 0 ...
如果在我的应用程序中,我在thread1,CPU_SET(24,& mask)中使用CPU_SET(0,& mask) 在thread2中,我可以说thread1和thread2将共享相同的L1缓存, 当然,也分享相同的二级缓存...我猜错了吗?
答案 0 :(得分:1)
如果你的线程被安排在同一个核心(即不同的超线程)上,你只能保证完全共享的缓存,在这种情况下你的方法是正确的。
但请记住,在同一核心上安排两个任务并不一定会使它们运行得更快,如果您在不同的核心上安排它们。通常在所有核心之间共享的L3非常快。
您需要检查处理器之间如何共享缓存。大多数英特尔处理器在2-4个内核中共享L2,在所有内核中共享L3,而大多数AMD型号仅共享L3。