使用MPI/OpenMP的C 程序带有派生数据类型(嵌套类对象)容器
C++ program with derived data type (nested class object) container using 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#node83和https://blogs.cisco.com/performance/how-to-send-cxx-stl-objects-in-mpi请提供一些建议。谢谢。
通过MPI发送非平淡无奇的对象与通过任何其他字节传输发送它们相同:您必须序列化。如果有帮助,您可以使用stringstream
将缓冲区保持在任一端。
但是,您很可能根本不应该这样做。创建对象所需的数据(例如,例如,循环范围和初始值(可能比用于持续计算的表单要小得多,更简单。相反,您可以并行创建复杂的对象并减少通信。(如果参数在静态上是已知的,则无需发送任何内容:每个过程都可以开始处理已知的初始化。(
相关文章:
- 用于返回嵌套类类型的作用域解析运算符
- CRTP - 嵌套叶类类型的可见性
- 使用MPI/OpenMP的C 程序带有派生数据类型(嵌套类对象)容器
- 如何在 C++ 中将结构类型向量数据输入到结构向量成员(嵌套结构向量)中
- 访问嵌套模板类型
- 嵌套模板类型的别名
- 传递具有依赖嵌套参数类型的模板模板参数时出错
- 嵌套指针类型在iterator_traits有什么用?
- 嵌套成员类型识别
- HDF5中嵌套的复合数据类型
- 清除嵌套数据
- 如何设计嵌套类类型相同的嵌套模板类
- 将模板专门化为嵌套类类型
- 嵌套模板类型铸造
- 带嵌套类的链表:如何在声明嵌套类类型之前使用它
- 在c++中,如何在另一个嵌套类中使用嵌套类类型(两个嵌套类在同一个外部类下)
- 不能在嵌套模板类型之间转换
- 析构函数如何删除嵌套堆栈类型
- 嵌套模板类型定义
- 以boost精神分析嵌套数据