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

标签 c++ class c++11 mpi openmp

我用 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#Node83https://blogs.cisco.com/performance/how-to-send-cxx-stl-objects-in-mpi 请提供一些建议。谢谢。

最佳答案

通过 MPI 发送不可平凡复制的对象与通过任何其他字节传输发送它们一样:您必须序列化。如果有帮助,您可以使用 stringstream 在两端保存缓冲区。

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

关于使用 MPI/OpenMP 的派生数据类型(嵌套类对象)容器的 C++ 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49640502/

相关文章:

c++ - 两行后 fstream 没有从文本文件中读取

c++ - 如何将我的程序背包问题暴力破解变成面向对象的问题?

python - 在类的 __iter__ 方法中生成字典键、值对

javascript - 如何访问自定义类中的方法?

c++ - 如何使用 C++ 中的模板从 json 中填充尽可能通用的 std::vector (11)?

c++ - 获取构造函数初始化错误

c++ - dynamic_cast 返回相同的对象类型失败,具有多重继承和中间变量

c++ - C++ 中的正则表达式编译错误

python - 为什么定义类时括号是可选的,而定义函数时是必须的?

c++ - std::vector 的高效初始化