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

use*_*630 8 c memory multithreading

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

假设我们使用的是C语言.一个简单的例子如下.如果我有一个巨大的数组A,我想复制AB相同大小的数组A.使用多线程比单线程更快地进行内存复制吗?有多少线程适合进行这种内存操作?

编辑:让我把问题缩小.首先,我们不考虑GPU案例.当我们进行GPU编程时,内存访问优化非常重要和有效.根据我的经验,我们总是需要小心内存操作.另一方面,当我们处理CPU时并非总是如此.另外,我们不要考虑SIMD指令,例如avx和sse.当程序具有太多的内存访问操作而不是大量的计算操作时,这些也将显示内存性能问题.假设我们使用1-2个CPU来运行x86架构.每个CPU都有多个内核和一个四通道内存接口.主内存是DDR4,因为它在今天很常见.

我的数组是一个双精度浮点数的数组,其大小类似于CPU的L3缓存大小,大约为50MB.现在,我有两种情况:1)通过执行元素副本或使用memcpy将此数组复制到具有相同大小的另一个数组.2)将许多小阵列组合成这个巨大的阵列.两者都是实时操作,这意味着它们需要尽可能快地完成.多线程是否提供加速或下拉?在这种情况下影响内存操作性能的因素是什么?

有人说它主要依赖于DMA性能.我想是在我们做memcpy的时候.如果我们进行逐元素复制,首先会通过CPU缓存怎么办?

Xav*_*ver 8

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

  • 有趣的是,我的简单测试表明,任务可以完美地扩展并且100%的CPU绑定(基本上调用memcpy)http://coliru.stacked-crooked.com/a/a61707960de650d9 (2认同)

hus*_*sik 3

多年来,CPU 性能大幅提升,简直呈指数级增长。RAM 性能无法跟上。它实际上使缓存变得更加重要。尤其是赛扬之后。

所以你可以增加或减少性能:

严重依赖于

  • 每个核心的内存读取和内存存储单元
  • 内存控制器模块
  • 内存模块的流水线深度和内存条的枚举
  • 每个线程的内存访问模式(软件)
  • 数据块、指令块的对齐
  • 通用硬件资源的共享及其数据路径
  • Operating system doing too much preemption for all threads

Simply optimize the code for cache, then the quality of cpu will decide the performance.


Example:

FX8150 has weaker cores than a i7-4700:

  • FX cores can have scaling with extra threads but i7 tops with just single thread (I mean memory-heavy codes)
  • FX has more L3 but it is slower
  • FX can work with higher frequency RAM but i7 has better inter-core data bandwidth (incase of 1 thread sending data to another thread)
  • FX pipeline is too long, too long to recover after a branch

it looks like AMD can share more finer-grained performance to threads while INTEL does give power to a single thread. (council assembly vs monarchy) Maybe thats why AMD is better at GPU and HBM.


If I had to stop speculation, I would care only for cache as it is not alterable in cpu while RAM can have many combinations on a motherboard.