False Sharing
这段代码定义了一个数组,然后给数组赋初值。看起来没有数据耦合问题,数组的每一个都是独立赋值的。弄清楚这个问题,要知道点一些计算机硬件的知识。
这个问题被称为 False Sharing,是因为在计算机中会有Cache,如图所示,每个CPU对应的Cache把内存中同一段地址区域中(Memory中的灰色区域)的值拷贝过去,并且会保持这段地址中值的一致性,所以当CPU 0中修改了这段区域的第一个值(红色所示),那么为了保持一致,会先通过某些机制,更新CPU 1的Cache中对应区域的值,然后才能执行其他任务,然后CPU1又修改了这段地址区域的第二个值(蓝色所示),同样为了保持一致,也会更新CPU0中的Cache中的内容。所以程序会来回地不停更新另一个Cache,导致程序执行很慢。
所以在写并行程序时要注意避免这个问题,更多内容请看Avoiding and Identifying False Sharing Among Threads