Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C MPI聚集稀疏向量_C_Arrays_Mpi_Sparse Matrix - Fatal编程技术网

C MPI聚集稀疏向量

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); 有没有更有效的方法? 谢谢 根据数组的稀疏程度,我可以想出几个。一个简单的方法是将布尔数组压缩成一个位数组,将其减

嗨,我得到了boolcarray(sizeResults的大小)的结果,它非常稀疏,因为大多数值都是false。 我正在使用MPI_GATHER从所有工作人员收集此数组,但是这非常耗时

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
    将需要一个额外的聚集操作,然后再减少向量长度。对于高延迟通信系统,只需收集整个位向量可能更有意义。