多线程的内存考虑因素

时间:2012-02-05 00:05:30

标签: c++ multithreading performance memory cpu

我正在C / C ++上实现am算法来处理一些向量,我认为因为我正在使用多核CPU而使它成为并行是一个好主意。我有一些GPGPU的经验,不良内存访问可能会破坏整个性能,我是否还需要考虑CPU内核之间的任何特殊访问布局?

由于

2 个答案:

答案 0 :(得分:4)

使用多处理器设置可能会遇到许多与内存相关的问题,其中一些问题可能会使应用程序变慢。

您需要大致了解盒子上的缓存行大小并尝试两件事:

  1. 限制由单个线程以近时间顺序访问的数据高速缓存行(特别是您写入的高速缓存行)的数量。即,避免“弄脏”比你必须更多的缓存行。
  2. 避免瘟疫让两个独立的线程“同时”访问同一个数据缓存行,只需一次写入。
  3. (如果您要处理必须被分页的大型数据结构,上述两条规则也适用于数据页。)

    尽可能为每个线程设置单独的工作数据结构(尤其是堆),而不是共享数据。特别要注意拥有一个所有线程都更新的公共计数器,并且(显然)避免锁定和信号量,除非在绝对需要同步线程的关键时刻。

答案 1 :(得分:1)

@Hot_Licks:实际上,如果线程是在同一个核心上运行的两个超线程,那么在读取或写入时让不同的线程访问它们没有问题。干净的线路在同一英特尔CPU上的硬件线程之间共享成本。甚至脏线也非常便宜地共享 - 尽管如果一个人在另一个人正在写作的同时读取数据,你可以得到MOnukes。 (奇怪的是,如果两个这样的硬件/超线程同时写入,则不会受到惩罚。)

使用AMD唯一的“线程”CPU,Bulldozer,我认为写共享成本更低。

但这仅适用于硬件线程,例如英特尔超线程或逻辑处理器,运行在相同的物理处理器上。如果他们在不同的物理处理器上运行,则没有胜利。由于大多数软件线程程序包都会随意迁移线程,因此您的规则并不是那么糟糕。

尽管如此,您仍然希望最小化(a)单个线程访问的行,以及(b)多个线程访问的行总数,即使其他线程没有共享。由于缓存 - MLC,LLC - 是有限的资源。但你是对的 - 一旦你错过了缓存......

相关问题