【发布时间】:2014-04-28 15:16:07
【问题描述】:
与我的previous question 涉及将二维数组复制到一维数组有关,我想知道是否有更好的方法来完成整个业务,我试图实现。因此,我想通过 MPI 将几个大型二维数组(它们作为数组的数组动态分配,但在编译时具有已知的大小)从主机传送到客户端,反之亦然。数据应该按列分散到客户端/从客户端收集。
我目前正在做的是将 2 维数组(实际上是 3 维数组的子数组)映射到静态分配的 1 维数组中,发送这些 1 维数组。通过 MPI 生成数组,然后在接收器处再次重建二维数组。但是,我觉得应该有比这更有效的东西(很多)......
非常感谢!
【问题讨论】:
-
为什么要使用数组数组数组?如果它们仅用于“语法糖”,请现在摆脱它们。您正在优化、并行化——这是第一步:没有副本、更好地使用缓存、使用线性代数库的可能性......
-
@Sigismondo 我不能同意你的观点,说你使用数组作为已知维度的表,你宁愿查找 foo[3][4] 还是 *(foo + 3 * width + 4)?不使用二维数组有什么好处?其次,如果询问者使用 MPI,他们需要使用副本,而 MPI 通常在进程之间没有共享内存,它们可能在不同的机器上,无法在它们之间加倍映射内存。
-
@Vality。 C 的问题是 foo[3][4] 在使用数组数组时表示 *(*(foo+3)+4) ,在使用 2D 静态数组时表示 *(foo +3*width +4) 。第二个是更好,是所有优化的线性代数库(ATLAS,libgoto)所做的,是支持多维数组的语言所做的(Fortran)。 C 的唯一问题是它不支持多维动态数组。但是数组的数组和二维数组是不一样的。
-
@Sigismondo 感谢您的回复,看看它是如何工作的真的很有趣。我很想看看在静态编译时间维度的情况下是否有任何常见的编译器能够显着优化这一点。但是,我确实看到您的观点,即明确将迫使它使用最有效的方式,谢谢。
-
@Vality。其实我错了... C89 不支持动态多维数组。但是 C99 DOES 支持多维动态数组 - 我也该停止使用 a[i*n+j] 了 - 在下面添加一个答案。谢谢你让我找这个:)
标签: c arrays multidimensional-array mpi