多线程内存访问是否比单线程内存访问更快?

时间:2017-02-07 21:01:23

标签: c multithreading memory

多线程内存访问是否比单线程内存访问更快?

假设我们使用的是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缓存怎么办?

3 个答案:

答案 0 :(得分:8)

这取决于很多因素。一个因素是您使用的硬件。在现代PC硬件上,多线程很可能不会导致性能提升,因为CPU时间不是复制操作的限制因素。限制因素是存储器接口。 CPU很可能使用DMA控制器进行复制,因此复制数据时CPU不会太忙。

答案 1 :(得分:3)

多年来,CPU性能大幅提升,实际上是指数级的。 RAM性能无法赶上。它实际上使缓存更重要。特别是在赛扬之后。

所以你可以增加或减少表现:

严重依赖

  • 每个内核的内存提取和内存存储单元
  • 内存控制器模块
  • 内存模块的流水线深度和内存条的枚举
  • 内存访问每个线程(软件)的模式
  • 数据块的对齐,指令blob
  • 共享及其常见硬件资源的数据路径
  • 操作系统对所有线程执行过多抢占

只需优化缓存代码,然后cpu的质量将决定性能。

示例:

FX8150的核心比i7-4700弱:

  • FX核心可以通过额外的线程进行扩展,但i7仅使用单线程(我的意思是内存繁重的代码),
  • FX有更多L3但速度更慢
  • FX可以使用更高频率的RAM但i7具有更好的核心间数据带宽(包括1个线程将数据发送到另一个线程)
  • FX管道太长,太长,无法在分支后恢复
看起来AMD可以为线程分享更细粒度的性能,而INTEL确实为单个线程提供了强大的功能。 (理事会大会与君主制)也许这就是为什么AMD在GPU和HBM方面表现更好。

如果我不得不停止猜测,我只关心缓存,因为它在cpu中是不可更改的,而RAM可以在主板上有许多组合。

答案 2 :(得分:0)

假设采用AMD / Intel64架构。

一个内核无法使内存带宽饱和。但这并不意味着多线程更快。为此,线程必须位于不同的内核上,启动尽可能多的线程,因为物理内核应该加快速度,因为操作系统最有可能将线程分配给不同的内核,但是在线程库中应该有一个绑定线程的函数对于特定的核心,使用它是最好的速度。另外要考虑的是NUMA,如果你有一个多插座系统。为了获得最大速度,您还应该考虑使用AVX指令。