C MPI聚集稀疏向量
嗨,我得到了boolcarray(sizeResults的大小)的结果,它非常稀疏,因为大多数值都是false。 我正在使用MPI_GATHER从所有工作人员收集此数组,但是这非常耗时C MPI聚集稀疏向量,c,arrays,mpi,sparse-matrix,C,Arrays,Mpi,Sparse Matrix,嗨,我得到了boolcarray(sizeResults的大小)的结果,它非常稀疏,因为大多数值都是false。 我正在使用MPI_GATHER从所有工作人员收集此数组,但是这非常耗时 MPI_Gather(result, sizeResults, MPI_BYTE, result_final, sizeResults, MPI_BYTE, 0, MPI_COMM_WORLD); 有没有更有效的方法? 谢谢 根据数组的稀疏程度,我可以想出几个。一个简单的方法是将布尔数组压缩成一个位数组,将其减
MPI_Gather(result, sizeResults, MPI_BYTE, result_final, sizeResults, MPI_BYTE, 0, MPI_COMM_WORLD);
有没有更有效的方法?
谢谢 根据数组的稀疏程度,我可以想出几个。一个简单的方法是将布尔数组压缩成一个位数组,将其减小到原始大小的1/8 您可以做的其他事情:
Gatherv
收集true
值的索引。例如,如果进程具有数组{T,F,F,F,F,T,F,F,T}
,那么它将发送数组{0,6,9}
true
值,后跟所有false
值,然后是下一个true
值。使用上述示例,您的3个段将是{T,F,F,F,F}
,{T,F,F}
,和{T}
。现在,您只需从每个进程Gatherv
获取每个段的长度。公平地说,这通常并不比方法1更有效谢谢你的回答!如何在MPI中使用位数组?最后,我确实使用了一个缓冲区来发送和接收它们,方法与gatherv相同。你认为重新分配向量并使用gatherv发送它会花费更少的时间吗?事实上,方法1和方法2的效率完全相同(给定或获取预处理和后处理时间)并且存在一个连接两个向量的线性变换(主对角线下为
1
s,主对角线上为0
s的下三角矩阵及其逆矩阵)。@iassael:MPI对位数组没有特定的支持,但是您可以简单地将一个作为MPI\u字节的数组发送,它将完全按照原样到达。我无法告诉您,对于您的特定场景,这种方法比任何其他方法更好还是更差:您应该自己测量。@HristoIliev:我刚从一个超过12小时的工作日回来,所以这可能只是疲劳的说法,但我认为在某些边缘情况下,方法2可以更有效。假设可以保证true
值以某种最小频率出现,那么段长度不可能存储在比数组索引更小的数据类型中(即short
而不是int
),从而导致更小的有效负载吗?这是完全有道理的。我说的是一般情况。请注意,使用MPI\u Gatherv
将需要一个额外的聚集操作,然后再减少向量长度。对于高延迟通信系统,只需收集整个位向量可能更有意义。