参照一维数组的情况,不难证明,如果二维数组的各个元素采用按地址顺序存储的方案,当并行存储体的个数是偶数时,对于n×n二维数组就不可能实现按行、按列、按对角线和反对角线的无冲突访问。
  当然,也可以针对不同的数组采取各种变通的措施,例如,采用不同的错位存储方案等。但是,这会给编译程序增加很大的麻烦,硬件实现的代价也很高。因此,希望寻找到一种对用户来说最为方便的均匀无冲突存储方案,能够实现二维数组的按行、按列、按对角线和反对角线的变址无冲突访问,而且,硬件实现比较简单,代价不要太高。

  对于n×n的二维数组,P·Budnik和D·J·Kuck提出了一种能够实现上述要求的无冲突存储方案。这种方案要求并行存储体的个数m≥n,并且取质数,同时还要在行、列方向上错开一定的距离存储数组元素。设同一列相邻元素在并行存储器中错开d1个存储体存放,同一行相邻元素在并行存储器中错开d2个存储体存放。当m=22p+1(p为任意自然数)时,能够同时实现按行、按列、按对角线和按反对角线无冲突访问的充要条件是:d1=2p,d2=1。
  以4×4的二维数组为例,取大于4的最小质数m=5作为并行存储体的个数,并把m代入关系式m=22p+1,解得到p=1,从而计算得到d1=21=2,d2=1。一个4×4的二维数组在5个存储体中的存储情况如图4.19所示。原来在同一列中的相邻元素要错开两个存储体存放,如a10要存放在2号存储体中,a20要存放在4号存储体中,…。原来在同一行中的各个元素仍然按顺序存放在该行中,但要按5取模。

图4.19 没有访问都不冲突的存储方案
  0号体 1号体 2号体 3号体 4号体
体内地址 0
1
2
3
a00 a01 a02 a03  
a13   a10 a11 a12
a21 a22 a23   a20
  a30 a31 a32 a33

  很明显,按照图4.19所示的存储方案,4×4二维数组在按行、列、对角线和反对角线访问时均没有冲突。并且,由于并行存储体的个数是质数,对于不同的变址位移量,对这个数组的访问仍然是没有冲突的。

  假设aij是n×n二维数组中的任意一个元素,则这个元素在无冲突并行存储器中的体号地址和体内地址可以通过如下的一般公式来计算:
  体号地址:(2p i+j+k)MOD m
  体内地址:i
  其中,0≤i≤n-1,0≤j≤n-1,k是数组的第一个元素a00所在体号地址,一般情况下取k=0;m是并行存储体的个数,要求m≥n且为质数;p是满足m=22p+1关系的任意自然数;MOD是模运算的符号。