gpt4 book ai didi

c - MPI 通信大型二维数组

转载 作者:太空宇宙 更新时间:2023-11-04 02:04:21 25 4
gpt4 key购买 nike

关于我的previous question关于将 2- 复制到一维数组,我想知道是否有更好的方法来完成整个业务,我尝试实现。所以,我想 MPI 将几个大的二维数组(它们作为数组的数组动态分配,但在编译时具有已知大小)从主机传递给客户端,反之亦然。数据应该按列分散到客户端/从客户端收集。

我现在正在做的是将二维数组(实际上是三维数组的子数组)映射到静态分配的一维数组中,发送这些 1-dim。通过 MPI 生成数组,然后在接收器处再次重建二维数组。但是,我觉得应该有比这更有效的东西......

非常感谢!

最佳答案

如果数组维度在编译时已知,例如使用静态维度,那么它就像分配一个线性数组然后使用一个指针转换为与多维数组形状对应的类型一样简单。例如,对于 3x5 整数数组,即

int array[3][5];

你可以改用:

int (*array)[5] = malloc(3*5*sizeof(int));

int (*)[5] 类型是指向包含 5 个元素的整数数组的指针。 array[0] 是第一个这样的 5 元素数组,array[0][3] 是第一个数组的第四个元素。

您也可以使用 3 维数组来实现。

int array[3][4][5];

变成:

int (*array)[4][5] = malloc(3*4*5*sizeof(int));

对于大小仅在运行时已知的数组,通常使用不同的技术。分配一大块内存,然后在其中构建一棵指针树。所以不是

int **array = malloc(3*sizeof(int *));
for (i = 0; i < 5; i++)
array[i] = malloc(5*sizeof(int));

这通常会给你非连续的数据存储,你会这样做:

int *array_storage = malloc(3*5*sizeof(int));
int **array = malloc(3*sizeof(int *));
for (i = 0; i < 3; i++)
array[i] = &array_storage[i*5];

存储现在是连续的。该技术的一个缺陷是必须调用两次 free() 才能释放数组:

free(array[0]); // Since array[0] == array_storage this frees the big chunk
free(array); // Frees the array of pointers

无需分配两个单独的动态存储,指针数组的位置可以与数据存储一起分配,然后单个 free(array); 将处理所有内容。

关于c - MPI 通信大型二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22555639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com