我正在使用C/C++实现一个处理向量的算法,考虑到我正使用多核CPU,所以想将它并行化。我有一些GPGPU的经验,那里不良的内存访问会破坏整个性能,那么在CPU核之间是否需要考虑特殊的访问布局呢?
谢谢。
谢谢。
在多处理器设置中,可能会遇到一些与内存相关的问题,其中一些问题会使应用程序变得非常缓慢。
您需要大致了解盒子上的高速缓存行大小,并尝试做到以下两点:
(如果您处理必须分页的大型数据结构,则上述两条规则也适用于数据页面。)
在可能的情况下,为每个线程设置单独的工作数据结构(特别是堆),而不是共享数据。 特别要注意所有线程更新的公共计数器,并且(显然)除了在绝对需要同步线程的关键时刻之外,请避免使用锁定和信号量。
@Hot_Licks: 实际上,如果线程是在同一个核心上运行的两个超线程,则不管是读还是写,让不同的线程访问它们都没有问题。在同一台Intel CPU上,干净的缓存行可以在硬件线程之间免费共享。即使是脏缓存行也可以非常便宜地共享 - 尽管如果一个人正在读取数据,而另一个人正在写入数据,可能会出现争用。 (奇怪的是,如果两个这样的硬件/超线程同时写入,则没有惩罚。)
对于AMD唯一的“多线程”CPU Bulldozer,我认为共享写入成本甚至更低。
但是,这仅适用于在同一物理处理器上运行的硬件线程,例如Intel超线程或逻辑处理器。如果它们在不同的物理处理器上运行,则没有优势。由于大多数软件线程包会任意迁移线程,因此您的规则并不那么严格。
尽管如此,您仍然希望最小化(a)单个线程访问的行数和(b)多个线程访问的总行数,即使其他线程没有共享。因为缓存 - MLC,LLC - 是有限的资源。但是您是正确的 - 一旦缺少缓存...