并行随机读取似乎效果很好–为什么?
考虑以下非常简单的计算机程序: for i = 1 to n: y[i] = x[p[i]] 这里和y是字节的n个元素数组,而p是字的n个元素数组。在这里,n很大,例如n = 2 31(这样,只有很小一部分的数据适合任何类型的高速缓存)。XXxÿÿyññnpppññnññnn = 231ñ=231n = 2^{31} 假设由随机数组成,在1和n之间均匀分布。ppp1个1个1ññn 从现代硬件的角度来看,这意味着: 读取很便宜(顺序读取)p [ i ]p[一世]p[i] 读取非常昂贵(随机读取;几乎所有读取都是高速缓存未命中;我们将不得不从主内存中获取每个单独的字节)x [ p [ i ] ]X[p[一世]]x[p[i]] 写很便宜(顺序写)。ÿ[ 我]ÿ[一世]y[i] 这确实是我所观察到的。与仅执行顺序读取和写入的程序相比,该程序非常慢。大。 现在出现一个问题:该程序在现代多核平台上的并行度如何? 我的假设是该程序不能很好地并行化。毕竟,瓶颈是主要内存。单核已经在浪费大部分时间,只是在等待主存储器中的某些数据。 但是,当我开始尝试瓶颈是这种操作的某些算法时,这并不是我观察到的! 我只是用OpenMP并行for循环替换了朴素的for循环(本质上,它将范围拆分为较小的部分,并在不同的CPU内核上并行运行这些部分)。[ 1,n ][1个,ñ][1,n] 在低端计算机上,加速确实很小。但是在高端平台上,我惊讶地发现我获得了出色的近线性加速。一些具体示例(确切的时间安排可能会有所偏离,会有很多随机变化;这些只是快速的实验): 2 x 4核Xeon(总共8核):与单线程版本相比,速度提高了5-8倍。 2 x 6核Xeon(总共12核):与单线程版本相比,速度提高了8-14倍。 现在,这完全出乎意料。问题: 究竟为什么这种程序并行化如此好?硬件会发生什么?(我目前的猜测是沿着这些思路的:从不同线程进行的随机读取是“流水线式的”,得到这些答案的平均速率比单线程情况要高得多。) 是否有必要使用多个线程和多个内核来获得任何加速?如果确实在主内存和CPU之间的接口中发生了某种流水线操作,那么单线程应用程序是否不能让主内存知道很快将需要, …