2010-04-21 29 views
4

我想用boost :: mpi :: send()调用发送名为ABC的用户定义结构。如何通过使用boost mpi的用户定义结构

给定的结构体包含一个向量“data”,其大小在运行时确定。结构体ABC的对象由主机发送给从机。 但是从设备需要知道向量“数据”的大小,以便从设备上有足够的缓冲区来接收这些数据。 我可以通过先发送大小并在接收从结构体ABC的对象之前初始化从机上足够的缓冲区来解决此问题。但是这会破坏使用STL容器的全部目的。

有谁知道更好的方法来处理这个问题吗?任何建议,非常感谢。

这里是一个示例代码,描述了我的程序的意图。由于上述原因,此代码在运行时失败。

struct ABC 
{ 
double cur_stock_price; 
double strike_price; 
double risk_free_rate; 
double option_price; 
std::vector <char> data; 
}; 

namespace boost 
{ 
namespace serialization 
{ 
    template<class Archive> 
    void serialize (Archive &ar, 
        struct ABC &abc, 
        unsigned int version) 
    { 
    ar & abc.cur_stock_price; 
    ar & abc.strike_price; 
    ar & abc.risk_free_rate; 
    ar & abc.option_price; 
    ar & bopr.data; 
    } 
} 
} 

BOOST_IS_MPI_DATATYPE (ABC); 

int main(int argc, char* argv[]) 
{ 
mpi::environment env (argc, argv); 
mpi::communicator world; 

if (world.rank() == 0) 
{ 
    ABC abc_obj; 
    abc.cur_stock_price = 1.0; 
    abc.strike_price = 5.0; 
    abc.risk_free_rate = 2.5; 
    abc.option_price = 3.0; 
    abc_obj.data.push_back ('a'); 
    abc_obj.data.push_back ('b'); 

    world.send (1, ANY_TAG, abc_obj;); 
    std::cout << "Rank 0 OK!" << std::endl; 
} 

else if (world.rank() == 1) 
{ 
    ABC abc_obj; 

    // Fails here because abc_obj is not big enough 
    world.recv (0,ANY_TAG, abc_obj;); 
    std::cout << "Rank 1 OK!" << std::endl; 

    for (int i = 0; i < abc_obj;.data.size(); i++) 
    std::cout << i << "=" << abc_obj.data[i] << std::endl; 
} 

MPI_Finalize(); 
return 0; 
} 

回答

3

你不应该发送vector对象本身在消息中,因为接收机只需要它的内容,和vector的内部状态可能会收到反正是有效的(存储器地址后,全乱了在发送端可能在接收端无效)。

相反,这里就是你需要做什么:

  1. 定义一个单独的结构有四个双打和一个简单的字符数组。
  2. 无论何时您需要发送,请为此新结构创建一个临时变量,然后用要发送的vector的内容填充char数组。
  3. 定义与此特定结构对象的大小相匹配的临时MPI数据类型。
  4. 发送临时结构体作为此临时数据类型的一个实例。
  5. 接收它在一个适当的大接收缓冲区(或提前发送大小)
  6. 根据char数组的内容重建ABC结构。

至少,这就是你需要用vanilla C++和MPI做的事。我不熟悉boost,所以我不知道它是否使这些步骤更容易。

+0

感谢suszterpatt的回复。 Boost仅增加了启用向量的好处。 我目前正在使用类似于你推荐的东西。 但这并未优化。 我很想知道我是否可以使用boost序列化和MPI库以任何方式对其进行优化 – lava 2010-04-21 22:34:52

+0

“未优化”是什么意思?你想优化哪个部分,以什么方式? – suszterpatt 2010-04-23 11:09:38

+0

可以发送的数据量受限于接收缓冲区的大小。为了避免它,我必须发送我发送的数据的大小,以便缓冲区可以分配给相同的。 我很想知道是否有办法摆脱这两个限制。 – lava 2010-04-23 19:35:05

0

BOOST_IS_MPI_DATATYPE仅限于固定长度数据。你的数组不固定长度,这就是它失败的原因。

+0

PS:只要用宏删除行,它应该开始工作。 – baol 2010-04-30 19:58:11

相关问题