gpt4 book ai didi

multithreading - 缓存一致性 : Threads vs Cores

转载 作者:行者123 更新时间:2023-12-03 12:51:44 35 4
gpt4 key购买 nike

我目前正在研究并发系统,当同时使用多个线程和多个内核时,我对缓存一致性的概念有些困惑。

据我了解的一些假设:

  • 核心有缓存
  • 内核一次可能有多个线程(如果是超线程)
  • 线程是正在处理的单行命令
  • 因此,线程不是物理硬件,线程没有缓存并使用内核的缓存

  • 假设一个核心有两个线程和 x是一个值为 5 的共享变量。两者都想执行:
    my_y = x;
    在哪里 my_y是由两个线程定义的私有(private)变量。现在假设线程 0 执行:
    x++;
    最后,假设线程 1 现在执行:
    my_z = x;
    在哪里 my_z是另一个私有(private)变量。

    我的书是这样说的:

    What's the value in my_z? Is it five? Or is it six? The problem is that there are (at least) three copies of x: the one in main memory, the one in thread 0's cache, and the one in thread 1's cache.



    这是如何运作的? x 至少有三份吗?为什么这本书规定每个线程都有自己的缓存?对我来说,运行两个线程的核心的值是 x 是有意义的。在其缓存中,因此两个线程在“他们的”(共享)缓存中都有值。

    换句话说,当 x++更新,核心缓存中的值将被更新。然后,线程 1 将执行 my_z = x;它仍然在核心的缓存中并且是最新的。因此,不会有一致性问题,因为两个线程基本上共享缓存。

    可能这本书假设每个内核只有一个线程,但该书之前确实提到了“如果线程多于内核”。 “如果线程数多于内核数”是否意味着内核具有多个线程(超线程),或者是否发生某种线程调度以使每个内核一次只有一个线程?

    即使是这种情况(核心的调度和一个核心一次只能有一个线程),如果一个核心拥有线程 0,则执行 x++然后获取试图执行 my_z = x;的线程1如果我没记错的话,x 的值仍然存在于该内核的缓存中。

    额外问题:线程的私有(private)变量如何存储在内存中?它们的存储方式是否与使用时被复制到核心缓存中的任何变量相同?如果是这种情况,如果多个线程正在使用缓存 - 无论是同时还是调度,在核心缓存中拥有一个私有(private)变量是否会成为问题?

    根据@biziclop 的要求,本书陈述了以下假设:
  • 我们使用 MIMD 系统,即节点具有相同的架构。 (不过,这本书并没有具体说明这是哪种架构)
  • 我们的程序是 SPMD。因此,我们将编写一个可以使用分支来实现多种行为的程序。
  • 我们假设核心是相同的,但异步操作。
  • 我们使用 C 语言进行编程,在本节中我们主要关注 Pthreads。

  • 任何帮助,将不胜感激!

    最佳答案

    why does the book specify that each thread has its own cache?



    作者是马虎。线程没有缓存。运行线程的处理器内核具有缓存。

    the book did previously [say,] "if there are more threads than cores". Does [that] imply that a core has more than one thread (hyperthreading) or is there some sort of thread scheduling happening so that each core only has one thread at a time?



    这些事情中的任何一件都可能是真的。我们已经确定作者在语言方面有点草率,因此将这句话从上下文中剔除,无法判断它是在谈论更多的硬件线程而不是内核还是更多的软件线程。

    how are the private variables of threads stored in memory?



    进程中的所有线程都看到相同的确切虚拟地址空间。从最广泛的意义上来说,“private”只是描述了一个只供一个线程使用的内存位置,与为什么该位置只供一个线程使用无关。

    在更狭义的意义上,每个线程都有一个函数激活记录堆栈(也称为“调用堆栈”),其中包含所有事件函数调用的参数和局部变量。在许多编程语言中,一个线程不可能与任何其他线程共享其 args 或 locals,因此这些内存位置自动是“私有(private)的”。在其他编程语言中,可以共享 arg 或本地,但程序员必须编写显式代码才能共享它,无论如何,这可能是个坏主意。

    will it be a problem to have a private variable in the core's cache if multiple threads are using the cache - whether simultaneously or scheduled?



    当两个不同的内存位置都散列到同一个缓存位置时,这称为冲突。是的!碰撞有时会发生。如果某个缓存行包含变量 X,而线程 T 想要访问恰好使用相同缓存行的变量 Y,则内存系统将让线程 T 在从主内存中获取数据时等待。

    这种现象也被称为“错误共享”(通常是当它成为问题时),如果您确定它实际上会降低程序的性能,您可以通过 Google 搜索策略来避免它。

    关于multithreading - 缓存一致性 : Threads vs Cores,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56260173/

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