MPI,避免复制非常大的对象 我有一个C++类的大实例,包含很多指针和引用很多数据结构,在我的串行代码中。现在需要实现一个使用MPI并行工作的线性解算器。请注意,代码将在共享内存体系结构而不是集群上运行。恐怕我应该重写整个课程结构

MPI,避免复制非常大的对象 我有一个C++类的大实例,包含很多指针和引用很多数据结构,在我的串行代码中。现在需要实现一个使用MPI并行工作的线性解算器。请注意,代码将在共享内存体系结构而不是集群上运行。恐怕我应该重写整个课程结构,c++,mpi,shared-memory,C++,Mpi,Shared Memory,但是,我想知道是否有一种安全的方法可以在所有其他进程中访问由主进程创建的如此大的对象 我搜索了很多,但唯一的方法似乎是在序列化之后发送/接收数据,例如使用boost,这会导致在运行时重复复制大量数据 我的代码的当前结构是: int main() { my_data struct1; read_file(&struct1); my_data struct2; read_file(&struct2);

但是,我想知道是否有一种安全的方法可以在所有其他进程中访问由主进程创建的如此大的对象

我搜索了很多,但唯一的方法似乎是在序列化之后发送/接收数据,例如使用boost,这会导致在运行时重复复制大量数据

我的代码的当前结构是:

    int main()
    { 
      my_data struct1;
      read_file(&struct1);

      my_data struct2;
      read_file(&struct2);

      data_container data(&struct1, &struct2);

      float time = 0;

      while(time < end_time)
      {    
        do_some_calc(&data);

       //a linear solver should be added here.
        sparse_matrix MATRIX;
        vector RHS, unknowns;
        create_coeff_matrix(&data, &MATRIX);
        create_RHS_vector(&data, &RHS);
        trilinos_solver(&MATRIX, &RHS, &unknowns);
      //--------------------------------------------

        update(&data, &unknowns);
        time++;
      }
      return 0;
    }
intmain()
{ 
my_数据结构1;
读取\u文件(&struct1);
我的_数据结构2;
读取\u文件(&struct2);
数据\容器数据(&struct1和&struct2);
浮动时间=0;
while(时间<结束时间)
{    
做一些计算和数据;
//应在此处添加线性解算器。
稀疏矩阵;
向量RHS,未知数;
创建系数矩阵(数据和矩阵);
创建_RHS_向量(&data,&RHS);
trilinos_解算器(矩阵、RHS和未知数);
//--------------------------------------------
更新(数据和未知数);
时间++;
}
返回0;
}

您对问题的描述有点模糊,能否提供更多细节?为什么你觉得你需要重写整件事?您打算如何进行并行实现?您有什么理由希望在这种情况下使用Mpi,从您所说的来看,这种情况似乎更适合共享内存并行?你看过openmp指令了吗?我需要解一个大的线性方程组(使用Trilinos)。即使在共享内存系统上,也可以使用MPI实现最高性能。我已经测试了启用OMP的构建版本,它比串行版本更耗时。在MPI下,各个进程都有自己的地址空间,就像单独的程序一样。这意味着一个进程上的指针在另一个进程上毫无意义。如果你想将一个复杂的对象从一个进程发送到另一个进程,是的,你必须以某种方式将它序列化。Trilinos有着相当好的声誉。我很惊讶他们的OpenMP实现比串行版本慢。这是我肯定会与Trilinos团队分享的信息,并进一步深入研究。