问题标签 [persistent-memory]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2045 浏览

x86 - 为什么 CLFLUSH 存在于 x86 中?

我最近了解了行锤攻击。为了执行这种攻击,程序员需要为特定数量的地址刷新 CPU 的完整缓存层次结构。

我的问题是:为什么在 x86 中需要CLFLUSH?如果所有 L* 缓存都透明地运行(即不需要显式缓存失效),那么使用该指令的原因是什么?除此之外:CPU 不是可以自由推测内存访问模式,从而完全忽略指令吗?

0 投票
1 回答
309 浏览

linux - 如何在 x86 上读取过时的值

我的目标是在没有缓存一致性的情况下读取过时和过时的内存值。我试图用来prefetchnta执行非临时加载,但它无法获取过时的值。我正在考虑执行某种流式内存到内存直接内存访问,但由于继续我当前的项目所需的大量背景知识,我遇到了一些麻烦。目前我正试图弄乱udmabuf,但即使这样也进展缓慢。应该注意的是,理想情况下我想忽略所有CPU 缓存的内容,包括当前的 CPU。

提供我的理由:我正在开发可用于证明为非易失性存储器编写的程序的正确性的软件。由于 CPU 缓存是易失的,CPU 的回写缓存仍然是易失的,需要观察它们如何写回内存的任意性质。

如果有人能给我一些关于如何进行的指示,我将不胜感激。我不介意深入研究 Linux 内核,事实上我现在正在这样做,也不介意修改它,我只需要一些正确方向的指导。

0 投票
1 回答
722 浏览

memory - 对将英特尔傲腾 DC SSD 用作 IMDT 的额外 RAM 感到困惑?

我对英特尔傲腾 DC 有点困惑。我希望我的 Optane DC 能够同时用作 DRAM 和存储。一方面,我了解到只有“Intel Optane DC Persistent Memory DIMM”能够作为 DRAM 运行。那是因为他有 2 种模式(内存模式和 App-Direct 模式)。另一方面,在此链接中:https ://www.intel.com/content/www/us/en/products/docs/memory-storage/solid-state-drives/optane-ssd-dc-p4800x-mdt -brief.html 我读到“采用英特尔® 内存驱动技术的 DRAM 和英特尔® 傲腾™ SSD 一起模拟了一个易失性内存池”。我很困惑,英特尔傲腾 DC SSD 是能够作为 DRAM 还是只能作为英特尔持久内存 DIMM 执行?

0 投票
2 回答
138 浏览

c - 有什么办法可以在linux中访问持久内存?

我正在使用 linux(debian 10) 中的持久内存

我正在使用 linux 内核 5.0.3,我有一个问题。

我的理解是正确的,linux将持久内存虚拟化为磁盘并将内存映射为virt_addr。

因此,操作系统通过内核通过文件系统访问持久内存。但我认为这是一种开销。如果持久内存已经被内存映射,那么直接通过 virt_addr 访问它会非常有效。

所以我想知道有没有办法在内核中启动持久内存的 virt_addr。

谢谢。

0 投票
1 回答
397 浏览

x86 - 写入和读取的持久内存缓存策略

是否有人知道尝试在 App Direct 模式下(即作为非易失性内存)使用英特尔傲腾 DC 内存(DCPMM)使用直写(WT)或不可缓存( UC) 内存策略?这个想法是使用常规内存作为非易失性(在发生故障时数据不会丢失),脏缓存行并不理想,因为它是易失性的。有多个链接显示使用写回 (WB) 或写组合 (WC) 与非临时访问 (NTA) 指令的示例,也使用 WB 和 CLFLUSHOPT 或 CLWB 写指令。与 WB/WC 相比,在使用 WT/UC 时没有将整个缓存行写入内存,除了带宽之外还有其他重要的缺点吗?

0 投票
1 回答
42 浏览

persistent-memory - 区分易失性和持久性变量,它会影响正确性吗?

根据我对持久性编程模型的理解,正确区分易失性变量和持久性变量取决于程序员。持久变量将需要某种原子更新,以便在发生电源故障时,恢复程序可以将程序的数据清理到一致的状态。

例如,如果我将一个节点插入到具有持久内存支持程序的链表的开头,我将不得不执行以下操作:

  1. 使用其中的新数据创建新节点
  2. 将“next”指针链接到链表的当前头
  3. 然后更新头指针以指向新节点。

每个步骤都必须使用 undo-log 或 redo-log 执行,以帮助恢复程序保持数据的一致状态。此外,每个步骤都必须通过冲洗和栅栏来坚持。

程序员想要确定哪些变量必须在故障中幸存下来,哪些不重要,以便它们不需要开销(“日志记录”和“刷新和围栏”)。这比听起来要困难得多,并且有很多关于它的研究和工具。

现在这是我的问题。假设我对持久性编程模型的理解是正确的,那么将所有易失性变量(例如循环计数器)视为持久性变量是否不正确?我知道这会导致大量开销,并被确定为“性能错误”。如果在任何情况下持久化 volatile 变量会影响恢复程序的正确性,我将不胜感激。

谢谢你。

0 投票
1 回答
964 浏览

x86 - 英特尔的 CLWB 指令使缓存行无效

我正在尝试为英特尔的clwb指令查找不会使缓存行无效的配置或内存访问模式。我正在使用 NVDIMM 对 Intel Xeon Gold 5218 处理器进行测试。Linux 版本为 5.4.0-3-amd64。我尝试使用 Device-DAX 模式并将这个字符设备直接映射到地址空间。我还尝试将此非易失性内存添加为新的 NUMA 节点并使用numactl --membind命令将内存绑定到它。在这两种情况下,当我使用clwb缓存地址时,它都会被驱逐。我正在使用 PAPI 硬件计数器和禁用的预取器观察驱逐。

这是我正在测试的一个简单循环。array 和 tmp 变量,都被声明为 volatile,所以真正执行了加载。

两次读取都给出了缓存未命中。

我想知道是否有其他人试图检测是否存在某种配置或内存访问模式会将缓存行留在缓存中?

0 投票
0 回答
251 浏览

x86 - 了解 clwb 指令的性能和行为

我试图了解 clwb 指令的读/写性能,并测试它在写入缓存行的情况下如何变化,而我只是在读取它。我希望对于写入情况,所花费的时间应该高于读取情况。为了进行同样的测试,这是我在 Intel Xeon CPU (skylake) 上运行并使用非易失性内存 (NVM) 进行读写存储的小代码片段

由于 clwb 没有明确地逐出缓存行,因此读取的下一次迭代可能会从缓存本身提供。在写入的情况下,缓存行在每次迭代中被修改,然后发出 clwb 将其写回。但是,写入所需的时间几乎等于我无法理解的读取情况。如果写入时间不包括将脏缓存线写回内存(或内存控制器)的时间

0 投票
1 回答
389 浏览

memory - 计算写入挂起队列中的分配数量 - NV 内存上的意外低结果

我正在尝试使用一些非核心硬件计数器,例如:skx_unc_imc0-5::UNC_M_WPQ_INSERTS. 它应该计算写入挂起队列的分配数量。该机器有 2 个采用级联湖架构的 Intel Xeon Gold 5218 CPU,每个 CPU 有 2 个内存控制器。linux 版本是 5.4.0-3-amd64。我有以下简单的循环,我正在阅读这个计数器。数组元素大小为 64 字节,等于缓存行。

对于这个循环,当我将内存映射到 DRAM NUMA 节点时,计数器会给出大约 150,000 个结果,这可能是有道理的:在这个 NUMA 节点前面的2 个内存控制器总共有 6 个通道,它们在交错中使用 DRAM DIMM模式。然后对于每个频道,我相信都有一个单独的 WPQ,因此 skx_unc_imc0 从整个商店中获得 1/6。skx_unc_imc0-5我得到了一些计数器papi_native_avail,据说每个计数器都用于不同的频道。

意外的结果是,我没有将程序映射到 DRAM NUMA 节点,而是将程序映射到非易失性内存,该内存作为单独的 NUMA 节点呈现到同一个套接字。每个插槽有 6 个 NVM DIMM,可创建一个交错区域。因此,当写入 NVM 时,应该使用类似的 6 个不同的通道,并且在每个通道前面,有相同的一个 WPQ,应该再次获得 1/6 写入插入。

UNC_M_WPQ_INSERTS在 NV 内存上仅返回 1000 左右。 我不明白为什么;我预计它会在 WPQ 中提供类似的大约 150,000 次写入。

我在解释/理解错误吗?或者每个通道是否有两个不同的 WPQ,具体取决于写入到 DRAM 还是 NVM?或者还有什么解释?

0 投票
0 回答
77 浏览

memory - 对英特尔傲腾的内存驱动技术 (IMDT) 和 DCPMM 内存模式之间的区别感到困惑

我对 IMDT 和英特尔 DCPMM 的内存模式之间的区别感到困惑。我知道这两种技术都使用 DRAM 作为额外的 L4 缓存,而英特尔 DCPMM 的内存模式使 DRAM 不可寻址(这意味着系统内存仅显示为 DCPMM 容量的总和)。我参考了下面的链接。

https://venturebeat.com/2019/12/09/optane-essentials-part-2-memory-modes-and-optimal-workloads/

所以我的问题是,IMDT 是否也会使系统 DRAM 不可寻址?此外,当我使用 IMDT 时,系统 DRAM 是否显示为系统内存计数?

谢谢。