- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
多处理器系统无序且异步地执行“真实”内存操作(那些影响最终执行的操作,而不仅仅是推测执行),因为等待全局状态的全局同步几乎总是不必要地拖延所有执行。另一方面,在每个单独的核心之外,从允许的行为角度(允许的语义)来看,从 L1 缓存开始的内存系统似乎是纯粹同步的、一致的、平坦的;显然时间取决于缓存大小和行为。
因此,在 CPU 上,一个极端被称为“寄存器”,根据定义它们是私有(private)的,而另一个极端则是共享内存;令人遗憾的是,在具有特殊命名或寻址模式的寄存器的微小空间之外,内存始终是全局的、共享的和全局同步的,并且实际上完全受制于所有栅栏,即使它是用作未命名寄存器的内存,对于目的是存储比少数寄存器容纳的更多的数据,而不可能被其他线程检查(除非使用 ptrace 进行调试,它显然会停止、暂停、序列化并存储执行的完整可观察状态)。
现代计算机上总是这样吗(现代=那些可以合理支持 C++ 和 Java 的计算机)?
为什么专用 L1 缓存不为那些仅由特定核心使用的内存单元提供类似寄存器的语义?无论如何,缓存必须跟踪共享的内存。当需要对内存操作进行严格的全局排序时,不必停止对此类本地数据的内存操作,因为没有其他核心正在观察它,并且缓存有能力在需要时停止此类外部访问。缓存只需要知道哪些内存单元是私有(private)的(非全局可读),直到无序操作停止,这使得一致性(缓存可能需要一种方法来要求核心序列化操作并发布一致的状态)内存中)。
是否所有 CPU 都停止并同步栅栏上的所有内存访问或同步操作?
内存可以用作几乎无限的寄存器资源而不受隔离吗?
最佳答案
实际上,与单处理器系统的设计方式相比,在没有其他线程访问的内存上运行的单核并不会为了维护全局内存语义而减慢太多速度。
但是在大型多插槽系统上,尤其是 x86,缓存一致性(窥探其他插槽)是导致缓存未命中导致内存延迟比单插槽系统更严重的部分原因,尽管。 (对于私有(private)缓存中丢失的访问)。
<小时/>是的,所有可以运行单个多线程程序的多核系统都使用 MESI 缓存一致性协议(protocol)的某种变体,在所有内核之间具有一致的共享内存。 (此规则的任何异常(exception)都被认为是外来的,必须专门编程。)
具有多个需要显式刷新的独立一致性域的大型系统更像是一个用于高效消息传递的紧密耦合集群,而不是 SMP 系统。 (普通 NUMA 多插槽系统具有缓存一致性:Is mov + mfence safe on NUMA? 特别针对 x86 进行详细介绍。)
<小时/>当某个核心的缓存线处于 MESI Modified 或 Exclusive 状态时,它可以对其进行修改,而无需通知其他核心有关更改的信息。一个高速缓存中的 M 和 E 状态意味着系统中没有其他高速缓存具有该行的任何有效副本。但加载和存储仍然必须遵守内存模型,例如x86 核心仍然必须按程序顺序将存储提交到 L1d 缓存。
<小时/>L1d 和 L2 是现代 CPU 核心的一部分,但您说得对,L1d 实际上并未经过推测性修改。可以推测性地读取它。
您所询问的大部分内容都是由具有存储转发功能的存储缓冲区处理的,允许执行存储/重新加载,而无需等待存储变得全局可见。
what is a store buffer?和 Size of store buffers on Intel hardware? What exactly is a store buffer?
存储缓冲区对于将推测性无序执行(将数据+地址写入存储缓冲区)从按序提交解耦到全局可见的 L1d 缓存来说是必不可少的。
即使对于有序核心来说,这也非常重要,否则缓存未命中存储将停止执行。通常,您希望存储缓冲区将连续的窄存储合并为单个更宽的缓存写入,特别是对于可以积极执行此操作的弱排序 uarch;许多非 x86 微架构仅对对齐的 4 字节或更宽的 block 进行完全有效的缓存提交。
在强有序内存模型上,推测性乱序加载并稍后检查是否有任何其他核心在我们“允许”读取该行之前使该行无效,这对于高性能也至关重要,从而允许命中-未命中使无序执行继续,而不是一个缓存未命中加载导致所有其他加载停止。
<小时/>此模型有一些限制:
mfence
或lock add
,或ARM dsb ish
必须耗尽存储缓冲区,因此存储到实际上不共享的线程私有(private)内存(并从中重新加载)仍然必须等待您关心的存储变得全局可见。关于memory - 在多处理器系统中,每个核心外部的内存在概念上总是平坦/统一/同步吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56268226/
Linux 有许多跨(假设是 2 个)CPU 内核执行的线程和进程。我希望我的单线程 C/C++ 应用程序成为 CPU0 上的唯一线程。我如何“移动”所有其他线程以使用 CPU1? 我知道我可以使用
我有一个类似于下图的数据库表 Table with 2 columns (UserId and value) 我将传递 UserId 和 2 个字符串。例如:userId: 1, key1: h1,
我想在我的新项目中使用 ASP.NET Core,因为我听说它更快。但是,该项目将使用广泛的数据库访问功能,Entity Framework Core 不支持其中一些功能。我想知道,是否可以使用 En
我已经使用 EntityFrameworkCore.SqlServer 2.0 开发了 asp .net core wep api 2.0 应用程序。它是使用数据库优先方法开发的。当尝试使用 dbco
我已经阅读了很多关于这个主题的文章,但我仍然无法处理这个问题。对不起,如果它是重复的,无论如何! 所以基本上,我正在从头开始构建一个 Angular 应用程序,并且我想按照最佳约定来组织我的代码。我有
我对MPI还是陌生的,所以如果这是一个琐碎的问题,请原谅我。我有一个四核CPU。我想运行一个在单个内核上使用两个进程的OpenMPI C++程序。有什么办法吗?如果是这样,那又如何?我提到了this
下面是一个传播异常处理机制的类问题,所需的输出是异常。任何人都可以解释为什么输出是异常,在此先感谢。 Class Question { public void m1() throws Excep
我想打印每个获得 CPU 时间片的进程的 name 和 pid。可能吗? 最佳答案 对于单个流程,您可以在以下位置获取此信息: /proc//stat 第14和第15个字段分别代表在用户态和内核态花费
我想知道是否可以识别具有特定 thread-id 的线程使用的物理处理器(核心)? 例如,我有一个多线程应用程序,它有两 (2) 个线程(例如,thread-id = 10 和 thread-id =
我有一个需要身份验证的 Solr 核心。假设我有一个用户,密码为password。当我现在尝试在控制台中创建一个 Solr 核心时 bin\solr create -c test 我收到 HTTP 错
我想为与使用它的项目不同的类库中的第二个和后续数据库创建迁移。有皱纹。我永远不会知道连接字符串,直到用户登录并且我可以从目录数据库 (saas) 中获取它。 对于目录数据库,我使用了来自 this 的
我想为一种可以产生 GHC Core 的简单语言创建一个前端。然后我想获取这个输出并通过正常的 GHC 管道运行它。根据this page , 不能直接通过 ghc 命令实现。我想知道是否有任何方法可
阅读文档,我构建了 2 个使用 BLE 连接 2 个 iDevices 的应用程序。 一个设备是中央设备,另一个是外围设备。 Central在寻找Peripheral,当找到它时,探索它的服务和特性,
在我的网络应用程序中,我对长时间运行的任务进行了操作,我想在后台调用此任务。因此,根据文档 .net core 3.1 Queued background tasks我为此使用这样的代码: publi
Solr 1.4 Enterprise Search Server 建议对核心副本进行大量更新,然后将其换成主核心。我正在按照以下步骤操作: 创建准备核心:http://localhost:8983/
它们是否存在,如果存在,文档和代码在哪里? 最佳答案 它们位于 Git 的 test 目录中。 https://github.com/jquery/jquery/tree/master/test 关于
我有一个 Lisp (SBCL 1.0.40.0.debian) 应用程序 (myfitnessdata),它使用以下代码来处理命令行参数: (:use :common-lisp) (:export
Core是GHC的中间语言。阅读Core可以帮助你更好地了解程序的性能。有人向我索要有关阅读 Core 的文档或教程,但我找不到太多。 有哪些文档可用于阅读 GHC Core? 这是我迄今为止发现的内
我有一个核心 WebJob 部署到 Azure Web 应用程序中。我正在使用WebJobs version 3.0.6 . 我注意到,WebJob 代码不会立即拾取对连接字符串和应用程序设置的更改(
我有一个在内部构造和使用 SqlConnection 类的第三方库。我可以从该类继承,但它有大量重载,到目前为止我一直无法找到合适的重载。我想要的是将参数附加到正在使用的连接字符串。 有没有办法在 .
我是一名优秀的程序员,十分优秀!