将几个二维数组复制到一个一维数组的最快方法(在C中)



我想复制几个三维数组的二维子数组(例如array1[n][rows][cols],…, array4[n][rows][cols]),这是动态分配的(但具有固定的长度),成一个1维数组(例如array[4*rows*cols]),这是静态分配的,在c中。因为将有许多行和列(例如10000行和500列),我想知道以下三种可能性中哪一种将是最快的:

    for(i=0;i<rows;i++){
      for(j=0;j<cols;j++){
        array[i*cols+j]=array1[2][i][j];
      }
    }
    ...
    for(i=0;i<rows;i++){
      for(j=0;j<cols;j++){
        array[3*rows*cols+i*cols+j]=array4[2][i][j];
        }
    }

    for(i=0;i<rows;i++){
      for(j=0;j<cols;j++){
        array[i*cols+j]=array1[2][i][j];
      }
      ...
      for(j=0;j<cols;j++){
        array[3*rows*cols+i*cols+j]=array4[2][i][j];
      }
    }

    for(i=0;i<rows;i++){
      for(j=0;j<cols;j++){
        array[i*cols+j]=array1[2][i][j];
        ...
        array[3*rows*cols+i*cols+j]=array4[2][i][j];
      }
    }

或者是否有更快的方法在C(不是c++)中执行此任务?

非常感谢!(我认为应该已经有一个类似的问题,但不幸的是没有找到我正在寻找的东西。所以,如果我错过了这样一个问题,我很抱歉。

编辑:这样做的原因如下:存储在这些二维(子)数组中的信息必须通过MPI进行通信。因此,客户端将执行上述操作,而主机(有点)则相反(即1维-> 2维)。那么,有没有更好的方法来做这件事呢?

假设线性数组和相同的维度(这会使我的答案无效):

for(i=0;i<rows;i++) {
  for(j=0;j<cols;j++) {
    array[i*cols+j]=array1[2][i][j];
  }
}

可以替换为:

memcpy(array, array1[2], sizeof(array1[2]));

for(i=0;i<rows;i++) {
  for(j=0;j<cols;j++) {
    array[3*rows*cols+i*cols+j]=array4[2][i][j];
  }
}

将是:

memcpy(array + 3*cols*rows, array4[2], sizeof(array4[2]));

C指定数组以行为主顺序存储,因此由于"引用的局部性",每个i包装每个j(以及每个j包装每个k,等等)将比替代方法更快。

然而,正如在注释中提到的,memcpy()将线性复制整个空格,忽略顺序。所以,几乎可以肯定的是,它不会更糟,而且会更容易保持直线,只有一个电话。只要确保使用sizeof()来获取存储的数组大小,因为实际存储可能比rows*cols大。

memcpy() 可能更糟糕的唯一情况是如果数组元素是指向其他东西的指针。此时,您只是将映射复制到实际数据中,这可能不是您想要的。

相关内容

  • 没有找到相关文章

最新更新