问题标签 [memory-bandwidth]

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 投票
0 回答
335 浏览

x86 - x86 对不可缓存内存的锁定前缀是否会导致内存带宽拒绝服务?

具有锁定前缀的指令能否在虚拟化环境中使其余 CPU(虚拟机)缺乏内存带宽?

例如,考虑以下一段代码

现在假设 rax 包含不可缓存的内存位置的地址。(使用 PAT 或 MTRR 将内存类型设置为 UC)。

这将迫使 CPU 锁定内存总线并减慢 CPU 其余部分的内存访问速度,这使其成为拒绝服务的潜在工具。

现代处理器是否具有在虚拟机之间分配内存带宽以防止此类攻击的机制?

0 投票
1 回答
70 浏览

cuda - 我什么时候必须乘以 2 来计算内存带宽

我通过一个例子来学习计算内存带宽 ,如下, 在此处输入图像描述

我不知道双倍数据速率是什么意思?GPU的哪个参数决定了这个?

  1. PCle是全双工的吗?
  2. 双槽?
  3. DDR的级别,比如DDR3/DDR5?

或其他?

0 投票
2 回答
3296 浏览

memory - 如何从 shell 计算给定(Linux)系统上的内存带宽?

我想编写一个 shell 脚本/命令,它使用常用的二进制文件、文件/sys系统或其他工具来计算给定机器上可用 RAM 的理论最大带宽。

笔记:

  • 我不关心延迟,只关心带宽
  • 我对缓存的影响(例如 CPU 的最后一级缓存)不感兴趣,但对从 RAM 正确读取的带宽感兴趣。
  • 如果有帮助,您可以假设一个“普通”英特尔平台,并且所有内存 DIMM 都是相同的;但我宁愿你不要做这个假设。
  • 如果有帮助,您可以依赖 root 权限(例如使用sudo
0 投票
0 回答
396 浏览

gpgpu - GPU的内存带宽受限和计算受限应用

在研究 GPU 和使用它们的应用程序时,经常使用术语“内存带宽受限”和“计算受限”而没有严格定义它们。(或解释它们是什么)

关于这个问题,我有 2 个问题。

  1. 如果一个应用程序是内存带宽受限的,这是否意味着应用程序会运行得更快(瓶颈是内存访问带宽)和更好的内存访问速度?如果一个应用程序是计算受限的,这是否意味着如果它有更多的计算资源或更快的计算,它会显示出更高的性能?就像减少单个操作的延迟并拥有更多的 ALU 单元一样)

  2. 如果我的理解是真的,那么今天的大多数应用程序都是内存带宽受限的,而不是计算受限的。自从流行使用 GPU 以来,情况是否一直如此?

0 投票
3 回答
3883 浏览

benchmarking - STREAM 内存带宽基准测试真正衡量的是什么?

我对 STREAM ( http://www.cs.virginia.edu/stream/ref.html#runrules ) 基准测试有几个问题。

  1. 以下是来自 stream.c 的评论。要求数组应该是缓存大小的 4 倍的基本原理是什么?
  1. 我最初假设 STREAM 测量峰值内存带宽。但是我后来发现,当我添加额外的数组和数组访问时,我可以获得更大的带宽数。所以在我看来,STREAM 并不能保证内存带宽饱和。那么我的问题是 STREAM 真正衡量的是什么,您如何使用 STREAM 报告的数字?

例如,我添加了两个额外的数组,并确保将它们与原始的 a/b/c 数组一起访问。我相应地修改了字节数。有了这两个额外的阵列,我的带宽数量增加了约 11.5%。

CFLAGS = -O2 -fopenmp -D_OPENMP -DSTREAM_ARRAY_SIZE=50000000

我的最后一级缓存大约是 35MB。

有什么通讯录吗?

谢谢!

这是针对 Skylake Linux 服务器的。

0 投票
1 回答
126 浏览

performance - 无法解释内存带宽数

我写了一个基准来计算内存带宽:

我编译

这会从 RAM 中产生一堆动作,然后是一些说是热的addpd指令perf,所以我进入生成的 asm 并删除它们,然后通过组装和链接

此时,得到一个perf我期望的输出:将数据移动到xmm寄存器中,指针的增量,以及jmp循环结束时的 a:

性能内存带宽

一切都很好,直到这里。现在事情变得奇怪了:

我询问我的硬件内存带宽是多少:

所以我最多应该得到 8 个字节 * 2.4 GHz = 19.2 GB/秒。但相反,我得到 48 GB/秒:

我对内存带宽有什么误解,导致我的计算错误超过 2 倍?

(另外,这是一个疯狂的工作流程,凭经验确定我有多少内存带宽。有更好的方法吗?)

sum_array删除添加说明后的完整 asm :

的完整输出lshw -class memory

CPU在这里相关吗?那么这里的规格:

clang 编译产生的数据更容易理解。随着向量变得比缓存大得多,性能单调下降,直到达到 19.8Gb/s:

在此处输入图像描述

这是基准输出:

在此处输入图像描述

0 投票
0 回答
1852 浏览

c - 多通道 x86 系统的内存带宽

我正在测试台式机和服务器上的内存带宽。

系统的峰值带宽为

我正在使用自己的STREAM 中的三元组函数来测量带宽(稍后会完整代码)

这是我得到的结果

对于 1 个线程,我不明白为什么桌面比服务器快得多。根据这个答案https://stackoverflow.com/a/18159503/2542702 SSE 足以获得双通道系统的全部带宽。这就是我在桌面上观察到的。两个线程仅略有帮助,而 4 和 8 线程的结果更差但是在服务器上,单线程带宽要少得多。为什么是这样?

在服务器上,我使用 96 个线程获得了最好的结果。我原以为它会被更少的线程饱和。为什么需要这么多线程来饱和服务器上的带宽?我的结果有很大的误差,我不包括误差估计。我取得了几次跑步的最佳成绩。

编码

0 投票
1 回答
651 浏览

performance - 随机内存写入比随机内存读取慢?

我试图弄清楚顺序/随机内存读/写的内存访问时间。这是代码:

我使用gcc 6.5.0with-O0来防止优化,但得到的结果如下:

很容易理解顺序访问比随机访问要快得多。但是,随机写入比随机读取慢而顺序写入比顺序读取快对我来说没有意义。什么原因会导致这种情况?

另外,我可以肯定地说内存带宽seqR(20 * ((1 << 27) - 1) * 4 * 1024 * 1024 * 1024)GB / (2.538)s = 4.12GB/s吗?

0 投票
1 回答
494 浏览

performance - MOVSD 性能取决于参数

我刚刚注意到我的一段代码在复制内存时表现出不同的性能。测试表明,如果目标缓冲区的地址大于源地址,则内存复制性能会下降。听起来很荒谬,但以下代码显示了差异(Delphi):

这里 CopyMemory 是基于 MOVSD 的。结果 :

开始内存带宽测试...

LpSrc 0x06FC0000

LpDest 0x0A1C0000

src->dest 传输:5242880000 字节在 1,188 秒 @4,110 GB/s。

dest->src 传输:5242880000 字节在 0,805 秒 @6,066 GB/s。

src->dest 传输:5242880000 字节在 1,142 秒 @4,275 GB/s。

dest->src 传输:5242880000 字节在 0,832 秒 @5,871 GB/s。

在两个系统上尝试过,无论重复多少次,结果都是一致的。

从来没有见过这样的事情。无法谷歌它。这是一种已知的行为吗?这只是另一个与缓存相关的特性吗?

更新:

以下是页面对齐缓冲区和 MOVSD 正向 (DF=0) 的最终结果:

开始内存带宽测试...

LpSrc 0x06F70000

LpDest 0x0A170000

src->dest 传输:5242880000 字节在 0,781 秒 @6,250 GB/s。

dest->src 传输:5242880000 字节在 0,731 秒 @6,676 GB/s。

src->dest 传输:5242880000 字节在 0,750 秒 @6,510 GB/s。

dest->src 传输:5242880000 字节,0,735 秒 @6,640 GB/s。

src->dest 传输:5242880000 字节,0,742 秒 @6,585 GB/s。

dest->src 传输:5242880000 字节在 0,750 秒 @6,515 GB/s。

... 等等。

这里的传输速率是恒定的。

0 投票
1 回答
823 浏览

c# - 为什么 C# SIMD 的性能增益对​​于较大的阵列比微型阵列低?

我一直在自己编写一个深度学习库。在矩阵运算中,获得最佳性能对我来说是关键。我一直在研究编程语言及其在数值运算方面的表现。一段时间后,我发现C# SIMD的性能与C++ SIMD非常相似。所以,我决定用 C# 编写这个库。

首先,我测试了C# SIMD(我测试了很多东西,但不会在这里写)。我注意到使用较小的数组时效果更好。使用更大的数组时效率不好。我认为这很荒谬。通常情况下,事情越大,效率越高。

我的问题是“为什么矢量化在 C# 中使用更大的数组时会变慢?”

我将使用BenchmarkNet分享基准(由我自己完成) 。

因此,如您所见,我将大小增加了 1000 倍,这意味着将数组的大小增加了 1000000 倍P2最初需要 154 ns。在第二次测试中,它花费了 170 毫秒,这是我们预期的 1000 倍以上。此外,P3 花费的时间正好是 1000 倍(100ns - 100ms)。但是,我想在这里提到的是,矢量化循环的 P1 的性能明显低于以前。我想知道为什么。

请注意,P3 独立于该主题。P1 是 P2 的矢量化版本。所以,我们可以说向量化的效率是 P2/P1 就他们所花费的时间而言。我的代码如下:

矩阵类:

节目类:

我向你保证,x[i,j]这不会影响性能。与使用相同x.Array[i*Size + j]