采用交叉访问方式,一个由n个存储体构成的主存储器,它的速度实际上并不能提高n倍,其根本原因是存在有访问冲突。产生访问冲突的根源主要有两个,一是程序中有转移指令,二是数据的随机性。从上面的分析结果看,后一个问题更为严重。
  下面,介绍一维和二维数组的无冲突访问存储器。
  先举一个一维数组的例子。如果采用交叉访问方式的并行存储器有4个存储体,交叉存放一维数组a0,a1,a2,……,如图4.16所示。
图4.16 一维数组的存储方案
  0号体 1号体 2号体 3号体
体内地址 0
1
2
3
A0 a1 A2 a3
A4 a5 A6 a7
A8 a9 a10 a11
  如果每次都按连续地址访问,就没有冲突问题,一个存储周期可以读出4个操作数。若一个存储周期需要读出更多的操作数,只要增加存储体的个数就可以了。如果要求按位移量为2的变址方式访问并行存储器(访问下标为奇数或偶数的操作数),则存储器的频带宽度就要降低一半,即可能有一半地址是冲突的。在并行递归算法中,典型的访问模式是向量子集的各个元素逐次按2的整数幂相间访问。例如,先按地址连续访问,然后按位移量为2的变址方式访问,再按位移量为4的变址方式访问等。对于这类算法,一般的交叉访问存储器就显得不能适应了。
  只要认真分析造成访问冲突的原因,不难发现传统的交叉访问存储器的存储体个数n为2的整数幂,因此变址位移量正好是n的约数。解决这一问题的方法很简单,只要把存储体的个数n选为质数,变址位移量就必然与n互质,一维数组的访问冲突自然也就不存在了。

  许多以向量计算为主要任务的大型计算机系统,其主存储器的存储体个数一般都是质数。例如,美国Burroughs公司研制的巨型科学处理机BSP,它的存储体个数为17,我国研制的银河巨型计算机,存储体的个数为31。

  对于多维数组,需要考虑的问题就复杂得多,为简单起见,下面仅讨论二维数组,讨论过程中所得出得的结论也可以推广到多维数组中。
  假设一个n×n的二维数组存储在一个并行存储器中。现在要求对这个二维数组实现按行、按列、按对角线和按反对角线访问,并且在不同的变址位移量情况下,都能实现无冲突访问。
  下面以4×4的二维数组为例来讨论这个问题。如果按照地址顺序存储,一个4×4二维数组存储在4个并行存储体中的情况如图4.17所示。显而易见,对于按行、按对角线访问能做到不发生冲突。但是,若按列访问,由于4个元素都放在同一个存储体内,只能分4个存储周期顺序读取它们。

4.17 按列访问有冲突的存储方案
  0号体 1号体 2号体 3号体
体内地址 0
1
2
3
a00 a01 a02 a03
a10 a11 a12 a13
a20 a21 a22 a23
a30 a31 a32 a33