使用MPI/OpenMP的C 程序带有派生数据类型(嵌套类对象)容器

C++ program with derived data type (nested class object) container using MPI/OpenMP

本文关键字:嵌套 数据类型 对象 容器 派生 OpenMP MPI 程序 使用      更新时间:2023-10-16

我已经在C 11中开发了一个程序,我想加快性能。

我将使用一个简单的示例来显示程序的结构(未完成(。

   //main.cpp
   #include "a.h"
   int main()
   {
     std::vector<a> a_container;
     for (auto i=0; i< 10K; i++)
     {
       a a_obj;
       a_container.push_back(a_obj);
     }
     for(time = 1; time< long_time; time++)
     {
       //i used openmp here already
       for (auto i=0; i< 10K; i++)
       {
         a_container[i].dosomething();
       }
       for (auto i=0; i< 10K; i++)
       {
         a_container[i].update();
       }
     }
     return 1;
   }
   //a.cpp
   //a.h
   #include "b.h"
   class a
   {
     int d;
     b b_obj;
     int dosomething();
   }
   //b.cpp
   //b.h
   class b
   {
      int c;
      double d;
      int dosomething();
   }

因此,为了加快程序的速度,我想同时使用MPI和OpenMP,主要是用于循环(最多可达100万〜10亿个实例(。

类对象A和B类都包含复杂的成员变量(标准和其他容器等(和功能。

通过使用OpenMP,我可以利用一个带有所有内核/线程的HPC节点。但是,如果我想使用MPI,我需要将所有实例分配给许多节点。

我还没有找到一个很好的解决方案,我现在拥有的最接近的东西是;http://mpi-forum.org/docs/mpi-2.2/mpi22-report/node83.htm#node83和https://blogs.cisco.com/performance/how-to-send-cxx-stl-objects-in-mpi请提供一些建议。谢谢。

通过MPI发送非平淡无奇的对象与通过任何其他字节传输发送它们相同:您必须序列化。如果有帮助,您可以使用stringstream将缓冲区保持在任一端。

但是,您很可能根本不应该这样做。创建对象所需的数据(例如,例如,循环范围和初始值(可能比用于持续计算的表单要小得多,更简单。相反,您可以并行创建复杂的对象并减少通信。(如果参数在静态上是已知的,则无需发送任何内容:每个过程都可以开始处理已知的初始化。(