多线程的内存注意事项

Cai*_*ian 3 c++ memory cpu performance multithreading

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

谢谢

Hot*_*cks 5

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

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

  1. 限制单个线程以接近的时间顺序访问的数据缓存行(特别是您写入的缓存行)的数量。即,避免“弄脏”比您必须的更多的缓存行。
  2. 避免像瘟疫一样让两个单独的线程“同时”访问相同的数据缓存行,其中一个写入。

(以上两条规则也适用于数据页,如果您正在处理必须分页的大型数据结构。)

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