- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于典型的 x86 多核处理器,比方说,我们有一个具有 2 个内核的处理器,并且两个内核在读取指令时都遇到了 L1 指令缓存未命中。我们还假设两个内核都在访问位于不同缓存行中的地址中的数据。这两个内核会同时从 L2 指令缓存获取数据到 L1 指令缓存,还是会被序列化?换句话说,我们是否有多个端口用于不同内核的 L2 缓存访问?
最佳答案
For typical x86 multicore processors, let us say, we have a processor with 2 cores
好的,让我们使用具有两个内核 (Conroe) 的 Intel Core 2 Duo 的一些早期变体。它们有 2 个 CPU 内核、2 个 L1i 缓存和共享的 L2 缓存。
and both cores encounter an L1 instruction cache miss when reading an instruction.
好的,在读取下一条指令时,L1i 中会出现 miss(L1d 中的 miss,当您访问数据时,以类似的方式工作,但只有从 L1i 读取和从 L1d 读取和写入)。每个未命中的 L1i 都会生成对下一层内存层次结构的请求,即对 L2 缓存的请求。
Lets also assume that both of the cores are accessing data in addresses which are in separate cache lines.
现在我们必须知道缓存是如何组织的(这是典型的中间细节缓存方案,逻辑上类似于真实硬件)。 Cache是具有特殊访问电路的内存阵列,它看起来像一个二维数组。我们有很多集合(这张图片中有 64 个),每个集合都有几种方式。当我们要求缓存从某个地址获取数据时,该地址被分成三部分:标签、设置索引和缓存行内的偏移量。集合索引用于选择集合(在我们的二维缓存内存数组中的行),然后将所有方式的标签与请求地址的标签部分进行比较(以在二维数组中找到正确的列),这是由 8 个标签并行完成的比较器。如果缓存中有等于请求地址标签部分的标签,则缓存已“命中”,并且来自所选单元格的缓存行将返回给请求者。
方式和集合;二维缓存数组(图片来自 http://www.cnblogs.com/blockcipher/archive/2013/03/27/2985115.html 或 http://duartes.org/gustavo/blog/post/intel-cpu-caches/ )
选择集合索引 2 的示例,并行标签比较器为方式 1 提供“命中”(标签相等):
某些内存或缓存的“端口”是什么?这是外部硬件 block 和内存之间的硬件接口(interface),其中包含请求地址行(由外部 block 设置,对于 L1,它由 CPU 设置,对于 L2 - 通过 L1),访问类型(加载或存储;可能是固定的端口)、数据输入(用于存储)和带有就绪位的数据输出(由内存设置;缓存逻辑也处理未命中,因此它在命中和未命中时都返回数据,但稍后会返回未命中的数据)。
如果我们想增加真正的端口数,我们应该增加硬件:对于原始 SRAM 存储器阵列,我们应该为每个位添加两个晶体管,以将端口数增加 1;对于缓存,我们应该复制所有标签比较器逻辑。但这成本太高,所以CPU中没有多少多端口内存,如果有多个端口,那么真正的端口总数就很少了。
但是我们可以模拟拥有多个端口。 http://web.eecs.umich.edu/~twenisch/470_F07/lectures/15.pdf EECS 470 2007 幻灯片 11:
Parallel cache access is harder than parallel FUs
Several approaches used
现代芯片使用多银行(有时称为切片)(“Intel Core i7 在 L1 中有四个银行,在 L2 中有八个银行”;ISBN 1598297546(2011 年)第 9 页的图 1.6 ) - https://books.google.com/books?id=Uc9cAQAAQBAJ&pg=PA9&lpg=PA9 )。这意味着,有几个较小尺寸的硬件缓存,并且请求地址的一些位(集合索引的一部分 - 认为集合 - 行分为 8 个部分或已着色为交错行)用于选择组。每个 bank 的端口数较少 (1),功能类似于经典缓存(每个 bank 中都有全套标签比较器;但 bank 的高度 - 其中的集合数量较小,并且阵列中的每个标签都被路由仅适用于单标签比较器 - 与单端口缓存一样便宜)。
Would those two cores get data from L2 to L1 instruction cache simultaneously or would it be serialized? In other words, do we have multiple ports for L2 cache access for different cores?
如果两个访问路由到不同的 L2 bank(切片),则缓存的行为类似于多端口,可以同时处理两个请求。但是如果两者都被路由到具有单个端口的单个 bank,它们将被序列化以用于缓存。缓存序列化可能会花费几个滴答,请求将在端口附近停滞; CPU 会将此视为稍长的访问延迟。
关于caching - 典型的多核处理器是否具有从 L1 到 L2 的多个端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27193349/
这是代码片段。 请说出这种用小内存存储大数据的算法是什么。 public static void main(String[] args) { long longValue = 21474836
所以我使用 imap 从 gmail 和 outlook 接收电子邮件。 Gmail 像这样编码 =?UTF-8?B?UmU6IM69zq3OvyDOtc68zrHOuc67IG5ldyBlbWFpb
很久以前就学会了 C 代码;想用 Scheme 尝试一些新的和不同的东西。我正在尝试制作一个接受两个参数并返回两者中较大者的过程,例如 (define (larger x y) (if (> x
Azure 恢复服务保管库有两个备份配置选项 - LRS 与 GRS 这是一个有关 Azure 恢复服务保管库的问题。 当其驻留区域发生故障时,如何处理启用异地冗余的恢复服务保管库?如果未为恢复服务启
说,我有以下实体: @Entity public class A { @Id @GeneratedValue private Long id; @Embedded private
我有下一个问题。 我有下一个标准: criteria.add(Restrictions.in("entity.otherEntity", getOtherEntitiesList())); 如果我的
如果这是任何类型的重复,我会提前申请,但我找不到任何可以解决我的具体问题的内容。 这是我的程序: import java.util.Random; public class CarnivalGame{
我目前正在使用golang创建一个聚合管道,在其中使用“$ or”运算符查询文档。 结果是一堆需要分组的未分组文档,这样我就可以进入下一阶段,找到两个数据集之间的交集。 然后将其用于在单独的集合中进行
是否可以在正则表达式中创建 OR 条件。 我正在尝试查找包含此类模式的文件名列表的匹配项 第一个案例 xxxxx-hello.file 或者案例二 xxxx-hello-unasigned.file
该程序只是在用户输入行数时创建菱形的形状,因此它有 6 个 for 循环; 3 个循环创建第一个三角形,3 个循环创建另一个三角形,通过这 2 个三角形和 6 个循环,我们得到了一个菱形,这是整个程序
我有一个像这样的查询字符串 www.google.com?Department=Education & Finance&Department=Health 我有这些 li 标签,它们的查询字符串是这样
我有一个带有静态构造函数的类,我用它来读取 app.config 值。如何使用不同的配置值对类进行单元测试。我正在考虑在不同的应用程序域中运行每个测试,这样我就可以为每个测试执行静态构造函数 - 但我
我正在寻找一个可以容纳多个键的容器,如果我为其中一个键值输入保留值(例如 0),它会被视为“或”搜索。 map, int > myContainer; myContainer.insert(make_
我正在为 Web 应用程序创建数据库,并正在寻找一些建议来对可能具有多种类型的单个实体进行建模,每种类型具有不同的属性。 作为示例,假设我想为“数据源”对象创建一个关系模型。所有数据源都会有一些共享属
(1) =>CREATE TABLE T1(id BIGSERIAL PRIMARY KEY, name TEXT); CREATE TABLE (2) =>INSERT INTO T1 (name)
我不确定在使用别名时如何解决不明确的列引用。 假设有两个表,a 和 b,它们都有一个 name 列。如果我加入这两个表并为结果添加别名,我不知道如何为这两个表引用 name 列。我已经尝试了一些变体,
我的查询是: select * from table where id IN (1,5,4,3,2) 我想要的与这个顺序完全相同,不是从1...5,而是从1,5,4,3,2。我怎样才能做到这一点? 最
我正在使用 C# 代码执行动态生成的 MySQL 查询。抛出异常: CREATE TABLE dump ("@employee_OID" VARCHAR(50)); "{"You have an er
我有日期 2016-03-30T23:59:59.000000+0000。我可以知道它的格式是什么吗?因为如果我使用 yyyy-MM-dd'T'HH:mm:ss.SSS,它会抛出异常 最佳答案 Sim
我有一个示例模式,它的 SQL Fiddle 如下: http://sqlfiddle.com/#!2/6816b/2 这个 fiddle 只是根据 where 子句中的条件查询示例数据库,如下所示:
我是一名优秀的程序员,十分优秀!