gpt4 book ai didi

multithreading - 了解弱内存模型

转载 作者:行者123 更新时间:2023-12-03 13:23:21 24 4
gpt4 key购买 nike

假设我们有两个线程,在内存中使用两个变量AB:

Thread 1       Thread 2
======== ========
1) A = 1 3) B = 1
2) Print(B) 4) Print(A)
我知道在 Sequential consistent (strong) model中你会得到 1 -> 2 -> 3-> 4按顺序执行。 x86是 TSO,它接近一个Strong模型(但不如一个强)。
我不知道“周”模式是什么?弱模型是否只是选择随机指令并执行?即像 4 -> 2 -> 3 -> 1这样的事情是可能的吗?
关于这个主题,我还有2个问题:
  • 由CPU通过利用可能会浪费的指令周期完成的Out-of-order executionmemory reordering due to memory model是同一件事吗?或memory reordering仅处理Load/Store指令?
  • 仅当处理多个线程时,memory model才是一个问题吗?为什么在单线程程序中这不是问题?
  • 最佳答案

    顺序一致性并不能告诉您它将完全执行1,2,3,4。
    顺序一致性告诉您,如果CPU0正在执行1,2,而CPU1正在执行3,4; CPU将按该顺序执行这些块,并且不会感觉到2之前的副作用(内存存储);并且在3之前不会感觉到4的副作用。
    如果是较早的A=B=0,则:

    Thread 1       Thread 2
    ======== ========
    1) A = 1 3) B = 1
    2) Print(A,B) 4) Print(A,B)
    所有顺序并发告诉我们,可能的输出是:
    Thread 1 { 1, 0 }, { 1, 1}
    Thread 2 { 0, 1 }, { 1, 1}.
    如果我们将其扩展到 A=B=C=D=0的初始状态
    Thread 1       Thread 2
    ======== ========
    A = 1 D = 1
    C = 1 B = 1
    Print(A,B,C,D) Print(A,B,C,D)
    Thread1有效输出:
    1: {1, 0, 1, 0}       -- no effects from thread2 seen
    2: {1, 0, 1, 1} -- update of D visible; not B
    3: {1, 1, 1, 0} -- update of B visible; not D
    4: {1, 1, 1, 1} -- update of B and D visible.
    Thread2有效输出:
    5: {0, 1, 0, 1}       -- no effects from thread1 seen
    6: {0, 1, 1, 1} -- update of C visible; not A
    7: {1, 1, 0, 1} -- update of A visible; not C
    8: {1, 1, 1, 1} -- update of A and C visible.
    在顺序一致性中,1,2,4:5,6,8是可能的。
    在较弱的一致性中,1,2,3,4:5,6,7,8是可能的。
    注意,在两种情况下,线程都不会按顺序看到自己的更新。但是输出3,7是线程看到其他线程乱序更新的结果。
    如果您需要维护特定的命令,则插入屏障指令[1]是首选方法。当CPU遇到障碍时,它会影响预取(读取障碍),存储队列(写入障碍)或两者(rw障碍)。
    当有两个内存写操作: A = 1; C = 1;时,您可以将写屏障安装为 membar w; store A; store C。这样可以确保在存储到A或C之前,可以看到存储到A之前的所有存储;但在A和C之间不强制排序。
    您可以将它们安装为 store A; membar w; store C,以确保A的存储区在C之前可以看到;和 store A; store C; membar w确保在任何后续存储之前都可以看到A和C。
    那么哪种壁垒或壁垒组合最适合您的情况?
    [1]更现代的体系结构将障碍纳入了加载并自己存储了指令;因此您可能会有一个 store.sc A; store C;。此处的优点是限制存储屏障的范围,以便存储单元仅需序列化这些存储,而不必承受整个队列的等待时间。

    关于multithreading - 了解弱内存模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63568149/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com