我用 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
在两端保存缓冲区。
但是,您很可能根本不应该这样做。 创建您的对象所需的数据(例如,循环边界和初始值)可能比用于持续计算的形式小得多和简单得多。相反,发送它,您可以并行创建复杂的对象并减少通信。 (如果参数是静态已知的,则无需发送任何内容:每个进程都可以开始处理已知的初始化。)
关于使用 MPI/OpenMP 的派生数据类型(嵌套类对象)容器的 C++ 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49640502/