在上述n×n二维数组的并行存储方案中,有1/(n+1)的存储单元是浪费的,这种存储方案实际上浪费了一个存储体。如果不要求同一行中的数组元素按地址顺序存储,则n×n的二维数组实际上只需要用n个并行存储体就能实现按行、列、对角线和反对角线的无冲突访问。这时,并行存储器的利用率最高,没有浪费的存储单元。
  对于任意一个n×n的二维数组,如果能够找到满足n=22p关系的任意自然数p,则这个二维数组就能够使用n个并行存储体实现按行、列、对角线和反对角线的无冲突访问。下面仍以4×4的二维数组为例,介绍如何计算数组元素的体号地址和体内地址。
  假设aij是4×4二维数组中的任意一个元素,其中的下标i和j都可以用两位二进制数表示,假设i和j的高位和低位分别为iH、iL、jH和jL,则aij在无冲突并行存储器中的体号地址和体内地址可以通过如下公式计算:
  体号地址:2(iLjH)+(iHiLjL)
  体内地址:j
其中,0≤i≤3,0≤j≤3,iH、iL、jH、jL均为0或1。
  根据这个体号地址和体内地址计算公式,一个4×4二维数组在4个并行存储体中的存储方案如图4.20所示。很容易验证这种存储方案能够实现按行、列、对角线和反对角线的无冲突访问。通过卡诺图很容易证明上述体号地址和体内地址计算公式是正确的。

图4.20 4×4数组用4个存储体的无访问冲突存储方案
  0号体 1号体 2号体 3号体
体内地址 0
1
2
3
a00 a20 a30 a10
a21 a01 a11 a31
a32 a12 a02 a22
a13 a33 a23 a03

  当数组的维数n大于4时,可以把数组划分成多个4×4的子阵。只要每个子阵都能实现按行、列、对角线和反对角线的无冲突访问,则整个数组必然也能实现这种无冲突访问。例如,可以把一个16×16二维数组划分成4个4×4子阵。实际上,在图4.20中的每个2×2子阵也都能实现按行、列、对角线和反对角线的无冲突访问。
  比较图4.19和图4.20两种二维数组的并行存储方案,两者的效果相同,都能实现按行、列、对角线和反对角线的无冲突访问。前一种方案多用了一个存储体,在整个并行存储器中有1/5的存储单元是浪费的;然而,这种存储方案也有一个明显的优点,在读或写并行存储器时所需要的对准网络非常简单。后一种方案虽然少用了一个存储体,没有浪费的存储单元,但是在执行并行读和并行写操作时需要借助比较复杂的对准网络。例如,在读并行存储器时,要通过一个对准网络把数组元素的地址变换成并行存储器的实际地址,读出的数据要通过另一个对准网络恢复成原来的顺序。因此,在实际应用时要根据具体情况决定采用哪一种存储方案。另外,在一般通用计算机的并行存储器中还存储有大量的一维数组和程序等,如前面所述,只要并行存储体的个数为质数,一维数组能够很容易实现不同位移量的变址无冲突访问,而且不会有存储单元的浪费现象。