升压测试单元不能调用mpi功能
我已经找遍了整个周围,但无法找到对此问题的任何参考。升压测试单元不能调用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::Init
和MPI::Finalize
,并没有其他函数的文件应该做任何MPI相关的东西。
有没有人遇到过类似的问题?
我的测试运行很长,因此我真的可以使用我的程序的并行版本!
感谢您的帮助
的函数,这既初始化,然后最终确定只能被调用一次,因为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中被删除。
如果我在BOOST_AUTO_TEST_CASE中执行所有并行化而不是调用parafunction,则会发生同样的情况... – 2013-02-28 03:27:01