Performance 现代机器的内存带宽性能

Performance 现代机器的内存带宽性能,performance,memory,hardware,memcpy,Performance,Memory,Hardware,Memcpy,我正在设计一个实时系统,偶尔需要复制大量内存。内存由非微小区域组成,因此我预计复制性能将相当接近相关组件(CPU、RAM、MB)所能达到的最大带宽。这让我想知道现代商品机器能收集到什么样的原始内存带宽 如果我使用一个线程来memcpy()(如果我同时使用两个内核memcpy(),可以理解的是,我老化的Core2Duo为我提供了1.5 GB/s的数据量。虽然1.5 GB是一个相当大的数据量,但我正在使用的实时应用程序将有大约1/50秒,这意味着30 MB。基本上,几乎什么都没有。也许最糟糕的是,当

我正在设计一个实时系统,偶尔需要复制大量内存。内存由非微小区域组成,因此我预计复制性能将相当接近相关组件(CPU、RAM、MB)所能达到的最大带宽。这让我想知道现代商品机器能收集到什么样的原始内存带宽

如果我使用一个线程来
memcpy()
(如果我同时使用两个内核
memcpy()
,可以理解的是,我老化的Core2Duo为我提供了1.5 GB/s的数据量。虽然1.5 GB是一个相当大的数据量,但我正在使用的实时应用程序将有大约1/50秒,这意味着30 MB。基本上,几乎什么都没有。也许最糟糕的是,当我添加多个内核时,我可以处理更多的数据,而无需提高所需复制步骤的性能

但如今,低端Core2Due并不是什么热门产品。是否有任何站点提供关于当前和近期硬件上原始内存带宽的信息(如实际基准)

此外,对于在内存中复制大量数据,是否有任何快捷方式,或者
memcpy()
是否达到了预期的效果

如果有一堆内核,除了在短时间内复制尽可能多的内存外,什么是我能做的最好的呢


编辑:我仍然在寻找关于原始内存拷贝性能的好信息。我刚刚运行了旧的
memcpy()
benchmark。相同的机器和设置,现在提供2.5 GB/s…

在Nehalem等较新的CPU和Opteron之后的AMD上,内存对一个CPU是“本地”的,其中一个CPU可能有多个核心。也就是说,内核访问连接到其CPU的本地内存需要一定的时间,而访问远程内存需要更多的时间,其中远程内存是其他CPU的本地内存。这称为非统一内存访问,或NUMA。为了获得最佳memcpy性能,您需要将BIOS设置为NUMA模式,将线程固定到内核,并始终访问本地内存。了解更多关于

不幸的是,我不知道有哪个网站或最近的论文介绍了memcpy在最近的CPU和芯片组上的性能。你最好的办法可能是自己测试一下

至于
memcpy()
性能,根据实现的不同,有很大的差异。例如,英特尔C库(或编译器本身)有一个
memcpy()
,比Visual Studio 2005提供的要快得多。至少在英特尔的机器上


您能够实现的最佳内存拷贝取决于数据的对齐方式、是否能够使用向量指令以及页面大小等。实现一个好的
memcpy()
令人惊讶,因此我建议在编写自己的实现之前,找到并测试尽可能多的实现。如果您了解有关拷贝的更多详细信息,例如对齐方式和大小,您可能能够实现比Intel的
memcpy()
更快的功能。如果您想了解详细信息,可以从英特尔和AMD优化指南开始,或者。

我认为您处理问题的方式不对。我认为,目标是导出数据的一致快照,而不破坏实时性能。不要使用硬件,使用算法

您要做的是在您的数据之上定义一个日志系统。当您开始内存内传输时,您有两个线程:一个是可以工作的原始线程,认为它正在修改数据(但实际上只是写入日志),另一个是新线程,它将旧的(未归档的)数据复制到一个单独的位置,以便它可以缓慢地将其写入

当新线程完成时,您将其用于合并数据集和日志,直到日志为空。完成后,旧线程可以返回直接与数据交互,而不是通过日志修改版本进行读/写

最后,新线程可以转到复制的数据并开始缓慢地将其传递给远程源


如果你这样设置一个系统,你可以在一个运行的系统中对任意数量的数据进行即时快照,只要你能在日志变得如此满以至于实时系统无法满足其处理要求之前完成内存中的拷贝。

我想第一个问题是“为什么?”,特别是,复制这么多内存应该完成什么?由于在复制内存时显然没有修改内存,因此传递一个指向它的指针应该可以完成同样的事情,而不会增加带宽。我只是在等待“为什么”。在这种情况下,这是因为我需要有两种状态:副本将缓慢发送到远程备份,而原始副本将不断修改。虽然这一回答提供了一般性的信息,但在某些方面似乎忽略了我提到的细节。例如,我明确地说我在复制大块内存。这意味着缓存不太重要:在这种情况下,内存瓶颈基本上来自RAM,然后,返回RAM,对吗?我读你关于“本地”内存的笔记的方式是,你说的是缓存。或者主RAM的某些部分对核心是“本地”的?我没有听说过这样的事情,但是请随意纠正我。不,我在谈论本地内存时没有提到缓存。在NUMA系统中,不同的RAM组物理上连接到不同的内核,或者更确切地说,连接到不同的CPU插槽。在双插槽系统中,RAM的一半物理连接到第一个插槽,另一半连接到第二个插槽。如果第二个插槽中的第二个a核必须访问连接到第一个插槽的内存,则数据必须经过更长的路径,首先通过第一个插槽。我会在文章中添加一个链接。@mch也许你应该编辑你的答案,因为它是指内核而不是CPU插槽