2013-02-28 68 views
1

我已经找遍了整个周围,但无法找到对此问题的任何参考。升压测试单元不能调用mpi功能

我写了一个C++程序,我正在用boost/unit进行测试。串行版本正常工作,单元测试正在工作。
现在我已经通过一个功能与MPI进行了令人尴尬的平行工作来使程序并行。如果写下我自己的测试调用并行函数 - 让我们称之为函数 - 它运行良好,MPI运行正常。
编译使用mpiC++完成,我使用mpixec来运行程序。

但是,如果我在boost测试案例中调用parafunction,那么MPI会全部错误,多次启动测试,并且在调用几个MPI::Init时进程崩溃。 以下是错误我得到的一个例子:

MPI_FINALIZE被调用后MPI_comm_size()函数被调用。

这是MPI标准所不允许的。

您的MPI工作现在将中止。

我的测试用例在test_unit上,由一个master_test_suite自动处理。正如我所说的没有平行化,它完美地工作。

段函数调用MPI::InitMPI::Finalize,并没有其他函数的文件应该做任何MPI相关的东西。

有没有人遇到过类似的问题?

我的测试运行很长,因此我真的可以使用我的程序的并行版本!

感谢您的帮助

+0

如果我在BOOST_AUTO_TEST_CASE中执行所有并行化而不是调用parafunction,则会发生同样的情况... – 2013-02-28 03:27:01

回答

1

的函数,这既初始化,然后最终确定只能被调用一次,因为MPI可以在程序的生命周期中只初始化一次,并且只能使用一次完成。为了防止多个初始化调用,把调用MPI_Init()MPI_Init_thread()一个条件:

int already_initialised; 

MPI_Initialized(&already_initialised); 
if (!already_initialised) 
    MPI_Init(NULL, NULL); 

至于最后确定,应该你的函数外移动,可能在atexit(3)处理程序,如果你不想用MPI呼叫污染外部范围。例如:

void finalise_mpi(void) 
{ 
    int already_finalised; 

    MPI_Finalized(&already_finalised); 
    if (!already_finalised) 
     MPI_Finalize(); 
} 

... 
atexit(finalise_mpi); 
... 

atexit()电话可能是初始化代码的一部分,例如:

int already_initialised; 

MPI_Initialized(&already_initialised); 
if (!already_initialised) 
{ 
    MPI_Init(NULL, NULL); 
    atexit(finalise_mpi); 
} 

如果MPI已经初始化这不会安装atexit(3)处理程序。基本思想是,如果MPI在进入函数时被初始化,那么这意味着MPI_Init()在外部范围中被调用,并且通常会期望MPI_Finalize()也在那里被调用。

如果我是你,我会将MPI初始化和定稿移出并行处理函数。正确的调用顺序是初始化MPI,运行测试,然后确定MPI。

我在上面的文本中使用了C绑定,因为C++绑定在MPI-2.2中被弃用,然后在MPI-3.0中被删除。