嗨,我有结果 bool C 数组(sizeResults 的大小),它非常稀疏,因为大多数值都是错误的。我正在使用 MPI_GATHER 从所有工作人员那里收集这个数组,但是它非常耗时......
MPI_Gather(result, sizeResults, MPI_BYTE, result_final, sizeResults, MPI_BYTE, 0, MPI_COMM_WORLD);
有没有更有效的方法来做到这一点?谢谢!
嗨,我有结果 bool C 数组(sizeResults 的大小),它非常稀疏,因为大多数值都是错误的。我正在使用 MPI_GATHER 从所有工作人员那里收集这个数组,但是它非常耗时......
MPI_Gather(result, sizeResults, MPI_BYTE, result_final, sizeResults, MPI_BYTE, 0, MPI_COMM_WORLD);
有没有更有效的方法来做到这一点?谢谢!
我可以想到几个,具体取决于您的数组的稀疏程度。一种简单的方法是将您的布尔数组压缩成一个位数组,将其减少到其原始大小的 1/8。
你可以做的其他事情:
而不是Gather
ing bool 值本身,而是值Gatherv
的索引true
。例如,如果一个进程有数组{ T, F, F, F, F, F, T, F, F, T }
,那么它将发送数组{ 0, 6, 9 }
。
如果您想获得创意,请将您的数组视为由段组成,其中段定义为一个true
值,其后是false
通向下一个值的所有true
值。使用上面的示例,您的 3 个段将是{ T, F, F, F, F, F }
、{ T, F, F }
和{ T }
。现在你需要Gatherv
从每个过程中得到每个段的长度。公平地说,这通常并不比方法 1 更有效。