多线程内存访问是否比单线程内存访问更快?
假设我们使用的是C语言。一个简单的例子如下。如果我有一个巨大的数组A
,我想将A
复制到数组B
,其大小与A
相同。使用多线程比单线程更快地进行内存复制吗?有多少线程适合进行这种内存操作?
编辑: 让我把问题缩小。首先,我们不考虑GPU案例。当我们进行GPU编程时,内存访问优化非常重要和有效。根据我的经验,我们总是需要小心内存操作。另一方面,当我们处理CPU时并非总是如此。另外,我们不要考虑SIMD指令,例如avx和sse。当程序具有太多的内存访问操作而不是大量的计算操作时,这些也将显示内存性能问题。假设我们使用1-2个CPU来运行x86架构。每个CPU都有多个内核和一个四通道内存接口。主内存是DDR4,因为它在今天很常见。
我的数组是一个双精度浮点数的数组,其大小类似于CPU的L3缓存大小,大约为50MB。现在,我有两种情况:1)通过执行逐元素复制或使用memcpy将此数组复制到具有相同大小的另一个数组。 2)将许多小阵列组合成这个巨大的阵列。两者都是实时操作,这意味着它们需要尽可能快地完成。多线程是否提供加速或下拉?在这种情况下影响内存操作性能的因素是什么?
有人说它主要依赖于DMA性能。我想是在我们做memcpy的时候。如果我们进行逐元素复制,首先会通过CPU缓存怎么办?
答案 0 :(得分:8)
这取决于很多因素。一个因素是您使用的硬件。在现代PC硬件上,多线程很可能不会导致性能提升,因为CPU时间不是复制操作的限制因素。限制因素是存储器接口。 CPU很可能使用DMA控制器进行复制,因此复制数据时CPU不会太忙。
答案 1 :(得分:3)
多年来,CPU性能大幅提升,实际上是指数级的。 RAM性能无法赶上。它实际上使缓存更重要。特别是在赛扬之后。
所以你可以增加或减少表现:
严重依赖
只需优化缓存代码,然后cpu的质量将决定性能。
示例:
FX8150的核心比i7-4700弱:
如果我不得不停止猜测,我只关心缓存,因为它在cpu中是不可更改的,而RAM可以在主板上有许多组合。
答案 2 :(得分:0)
假设采用AMD / Intel64架构。
一个内核无法使内存带宽饱和。但这并不意味着多线程更快。为此,线程必须位于不同的内核上,启动尽可能多的线程,因为物理内核应该加快速度,因为操作系统最有可能将线程分配给不同的内核,但是在线程库中应该有一个绑定线程的函数对于特定的核心,使用它是最好的速度。另外要考虑的是NUMA,如果你有一个多插座系统。为了获得最大速度,您还应该考虑使用AVX指令。