问题标签 [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 投票
5 回答
1068 浏览

optimization - 流式传输的有效内存带宽使用

我有一个流过 250 MB 数据的应用程序,对数据块(每个只有 2 个 32 位字)应用一个简单而快速的神经网络阈值函数。基于(非常简单的)计算的结果,该块不可预测地被推入 64 个 bin 之一。所以它是一个大流输入和 64 个较短(可变长度)的流输出。

使用不同的检测功能重复多次。

计算受内存带宽限制。我可以这么说,因为即使我使用计算量更大的判别函数,速度也没有变化。

构建新流的写入以优化我的内存带宽的最佳方法是什么?我特别认为了解缓存使用和缓存行大小可能在其中发挥重要作用。想象一下最坏的情况,我有 64 个输出流,运气不好,许多都映射到同一个缓存行。然后,当我将接下来的 64 位数据写入流时,CPU 必须将过时的缓存行刷新到主内存,并加载到正确的缓存行中。每个都使用 64 字节的带宽......所以我的带宽受限应用程序可能会浪费 95% 的内存带宽(不过,在这个假设的最坏情况下)。

甚至很难衡量效果,因此围绕它设计的方法更加模糊。还是我什至在追逐一个幽灵瓶颈,以某种方式硬件优化得比我好?

如果这有什么不同,我正在使用 Core II x86 处理器。

编辑:这是一些示例代码。它流过一个数组并将其元素复制到伪随机挑选的各种输出数组。使用不同数量的目标箱运行相同的程序会产生不同的运行时间,即使完成了相同数量的计算和内存读取和写入:

2 个输出流:13 秒
8 个输出流:13 秒
32 个输出流:19 秒
128 个输出流:29 秒
512 个输出流:47 秒

使用 512 与 2 个输出流之间的差异是 4 倍,(可能??)由缓存行驱逐开销引起。

0 投票
1 回答
1379 浏览

performance - 单核能否使 CPU 的内存 IO 带宽饱和?

假设一个理想的情况:没有任何内容被分页,所有代码都写得很好并且适合缓存,调度程序永远不会中断你,等等:多核 CPU 中的单个内核能否产生足够的写入流量以使 IO 总线饱和DIMM?

以更具体的形式:如果我要启动一个memset在一个线程中执行 16GB 的程序,它的运行速度会比一对不重叠memset的 8GB 慢吗?(选择的尺寸足够大以达到稳定状态。)

0 投票
8 回答
41178 浏览

c - 如何提高 memcpy 的性能

概括:

memcpy 似乎无法在我的系统上以超过 2GB/秒的速度在真实或测试应用程序中传输。我可以做些什么来获得更快的内存到内存副本?

完整详情:

作为数据捕获应用程序的一部分(使用一些专门的硬件),我需要将大约 3 GB/秒的数据从临时缓冲区复制到主内存中。为了获取数据,我为硬件驱动程序提供了一系列缓冲区(每个 2MB)。硬件 DMA 将数据发送到每个缓冲区,然后在每个缓冲区已满时通知我的程序。我的程序清空缓冲区(memcpy 到另一个更大的 RAM 块),并将处理后的缓冲区重新发布到卡上以再次填充。我在使用 memcpy 足够快地移动数据时遇到问题。似乎内存到内存的复制速度应该足够快,可以在我正在运行的硬件上支持 3GB/秒。Lavalys EVEREST 为我提供了 9337MB/秒的内存复制基准测试结果,但我无法通过 memcpy 获得接近这些速度的任何地方,即使在一个简单的测试程序中也是如此。

我通过在缓冲区处理代码中添加/删除 memcpy 调用来隔离性能问题。如果没有 memcpy,我可以运行完整的数据速率——大约 3GB/秒。启用 memcpy 后,我的速度被限制在大约 550Mb/秒(使用当前编译器)。

为了在我的系统上对 memcpy 进行基准测试,我编写了一个单独的测试程序,它只在某些数据块上调用 memcpy。(我在下面发布了代码)我已经在我正在使用的编译器/IDE(National Instruments CVI)以及 Visual Studio 2010 中运行了它。虽然我目前没有使用 Visual Studio,但我愿意如果它会产生必要的性能,则进行切换。但是,在盲目移动之前,我想确保它可以解决我的 memcpy 性能问题。

Visual C++ 2010:1900 MB/秒

NI CVI 2009:550 MB/秒

虽然 CVI 明显比 Visual Studio 慢我并不感到惊讶,但 memcpy 性能如此之低让我感到惊讶。虽然我不确定这是否可以直接比较,但这远低于 EVEREST 基准带宽。虽然我不需要那么高的性能,但至少需要 3GB/秒。当然,标准库的实现不会比任何 EVEREST 使用的更糟糕!

在这种情况下,我能做些什么来让 memcpy 更快?


硬件细节:AMD Magny Cours - 4x 八核 128 GB DDR3 Windows Server 2003 Enterprise X64

测试程序:

编辑:如果您有额外的 5 分钟时间并想做出贡献,您可以在您的机器上运行上述代码并将您的时间作为评论发布吗?

0 投票
2 回答
2392 浏览

python - python for-loop 每次迭代都会变慢

我正在尝试优化一些python代码(以加快一些矩阵运算),我的代码类似于这个(我的真实数据集也类似于'gps'),

我想了解的是,为什么程序在第一次迭代期间开始快速运行,然后随着进一步迭代而减慢?我知道这个问题可能有点幼稚,但我真的想在尝试其他任何事情之前更清楚地了解正在发生的事情。我已经在 Fortran 中实现了我的函数(在 Fortran 领域内保留任何 for 循环)并使用 f2py 创建一个动态库来从 python 调用函数,这将是 python 中的新代码。

不幸的是,我只是(令人惊讶地)发现我的 fortran-python 版本比第一个版本慢 1.5 ~ 2 倍(重要的是要提到我在 Fortran 实现中使用了 MATMUL() )。我已经在谷歌上搜索了一段时间,我相信这种“减速”与内存带宽、内存分配或缓存有关,因为数据集很大,但我不太确定背后到底发生了什么以及如何我可以提高性能吗?我已经在小型英特尔原子、2GB ram 和 4 核英特尔至强处理器上运行了代码,8GB(当然还有相应缩放的数据集)并且“减速”行为是相同的。

我只需要了解为什么会发生这种“减速”?如果我在 C 中实现这个函数会有什么好处吗?或尝试实现它以在 GPU 上运行?任何其他想法如何改进它?提前致谢

0 投票
1 回答
4567 浏览

cuda - CUDA:内存性能,什么是全局内存带宽

我正在学习 CUDA 优化。我在此链接上找到了一个演示文稿:Paulius Micikevicius 的 Optimizing CUDA

在本次演讲中,他们谈到

最大化全球内存带宽

,他们说全局内存合并将提高带宽。

我的问题,你如何计算全局内存带宽。谁能用一个简单的程序示例来解释我。

0 投票
1 回答
169 浏览

scalability - 在何处以及如何托管我们的 Web 应用程序以获得高性能和可用性

我一直在 Codeigniter 框架上使用 PHP 和 MySql 开发应用程序。它已经完成,我正在上线之前对其进行测试。我预计在接下来的几个月内会有大约一百个用户。我希望每天都会有越来越多的应用程序用户使用它。我的问题是高可用性、快速服务和数据库大小。

有人可以提供一个链接,我可以在其中获得以下问题的答案:

在有多少用户之后,应用程序会变得沉重?我应该购买普通的网络托管计划还是专用服务器?服务器和连接的配置应该是什么?云托管会更好吗?如何增加我的数据库的大小?

温暖的问候

0 投票
3 回答
191 浏览

c++ - 使用指针会导致内存阻塞吗?

假设我有这个结构c++

c与创建指向 c 的直接指针并使用它相比,十次访问这些值需要更多的内存流量吗?用代码术语(假设合法值):

对比

谢谢。

0 投票
2 回答
3013 浏览

c++ - OpenMP 和内核/线程

我的 CPU 是 Core i3 330M,有 2 个内核和 4 个线程。当我在终端中执行命令 cat/proc/cpuinfo时,就像我有 4 个 CPU。当我使用 OpenMP 函数时get_omp_num_procs(),我也得到 4。

现在我有一个标准的 C++ 向量类,我的意思是一个不使用表达式模板的固定大小的双数组类。我已经仔细地并行化了我班级的所有方法,并且得到了“预期的”加速。

问题是:在这种简单的情况下,我能猜出预期的加速吗?例如,如果我在没有并行化 for 循环的情况下添加两个向量,我会得到一些时间(使用 shell time 命令)。现在,如果我使用 OpenMP,我应该根据核心/线程数得到一个时间除以 2 还是 4?我强调我只是在问这个特别简单的问题,数据中没有相互依赖,一切都是线性的(向量加法)。

这是一些代码:

我已经阅读了这篇文章:OpenMP thread mapping to physical cores

我希望有人能告诉我更多关于 OpenMP 如何在这个简单的案例中完成工作的信息。我应该说我是并行计算的初学者。

谢谢!

0 投票
2 回答
586 浏览

multithreading - 如果程序受内存限制,并行化对性能有多大帮助?

我并行化了一个 Java 程序。在具有 4 核的 Mac 上,以下是不同线程数的时间。

在具有两个套接字的 Linux 服务器上,每个套接字有 4 个内核,下面是测量的时间。

如您所见,加速比远离线性加速。在这种情况下,几乎没有并行化开销,例如同步或 I/O 依赖性。

我有两个问题:

  1. 这些数据是否意味着这个 Java 程序是内存受限的?
  2. 如果是这样,有没有办法在不改变硬件的情况下进一步提高性能?
0 投票
3 回答
39192 浏览

gpu - 如何从内存时钟/内存速度获取内存带宽

仅供参考,这是我从 Nvidia 获得的规格

http://www.geforce.com/hardware/desktop-gpus/geforce-gtx-680/specifications

http://www.geforce.com/hardware/desktop-gpus/geforce-gtx-titan/specifications

请注意,内存速度/内存时钟在他们的网站上是相同的,都以 Gbps 为单位。

谢谢!