我在裸机环境中工作,从而评估低级别的性能。在写入同一缓存行的不同部分时,我应该如何期望同一核心上的两个线程执行?
我对多核/多线程架构有些新意。据我所知,当不同的内核写入相同的高速缓存行时,需要进行原子操作以确保避免竞争条件。同时,在核心之间共享缓存线也会为性能问题设置一个,例如虚假共享。
然而,当两个线程在同一个核心上时,我是否需要担心类似的事情?我不确定看到他们共享相同的缓存并且有多个加载存储单元。例如,假设thread1在thread2想要写入缓存行的section2的同时写入缓存行的section1。每个线程是仅修改自己的缓存行部分,还是读取整行,修改其部分,并将整行写回缓存?如果是后者,我是否需要担心竞争条件或性能延迟?
答案 0 :(得分:-2)
你过于复杂了。
有不同的缓存层,非常具体地取决于你使用的cpu,不仅仅是x86或arm,而是使用哪种架构版本/代,但是你可能有一个L1缓存紧密连接到各个核心,那么L2就是核心在共享内存/地址空间的路上聚集在一起。
所有缓存都会在主内存(空间)总线上的任何层上运行并观察事物,如果事务被标记为可缓存,则它会检查其标记以查看是否存在命中或未命中并执行操作因此。缓存不知道,不知道,也不关心是谁或什么导致该事务,是指令是什么指令,什么任务/程序/线程是该指令,是预取,是dma引擎。并不关心,有任何其他事务遵循规则,如果不是可缓存的话,传递它,如果可缓存寻找命中并处理命中或未命中。
因此,如果您有多个核心/ cpu命中共享缓存,并且由于某种原因它们碰巧访问内存如此接近以至于它位于同一缓存行中,那么缓存将相应地做出反应。 / p>
如果你有两个线程相同的cpu,整个同时的东西不适用,当然它也不适用于共享的cpu,你可以让它们相隔一个时钟,但它是一个共享总线,通常不是这个级别的双/多端口。但是,尽管缓存将根据其设计进行操作,但如果标记为不可缓存,则忽略并传递,或者如果匹配则搜索命中并执行相应的操作。