这些是我在为应该使用 MPI(在 C++ 中)并行运行的算法设计错误处理时遇到的一些一般性问题:
- 异常是否在并行执行的代码中起作用?行为是否已定义?
- 它们是如何工作的?不同的实现方式是否有所不同?
- 这是好的做法 - 还是我应该使用返回码?
最佳答案
在理想情况下,您可以使用它们来完成您的要求。我所说的“理想世界”是指您可以选择 MPI 实现并能够自己管理它(而不是说服集群所有者为您重新配置它)。异常的最小配置将包括:--with-exceptions 标志,可能还有一些。
我最常使用 LAM,默认情况下禁用异常。我相信这也是其他实现的默认设置。
它们的工作方式与“普通”C++ 异常相同。它们确实在并行执行的代码中工作。
在您的启动代码中的某个时刻,您想启用它们:
MPI::COMM_WORLD.Set_errhandler ( MPI::ERRORS_THROW_EXCEPTIONS );
(如果您的库未配置为允许异常,这可能是个坏主意——根据 LAM,行为“未定义”)
然后:
try { /* something that can fail */ }
catch ( MPI::Exception e ) {
cout << "Oops: " << e.Get_error_string() << e.Get_error_code();
MPI::COMM_WORLD.Abort (-1) ;
}
至于这是好事还是坏事,我真的不能说。我还没有看到在由顽固的 MPI 黑客编写的代码中广泛使用它们,但这可能是因为根据我的经验,代码通常比 C++ 更多的是 C。
错误代码和异常之间的中间地带可能是错误处理程序,简而言之,您可以分配将在发生特定错误(由代码指定)时调用的函数。如果您无法通过启用异常(exception)让您的管理员参与进来,这可能是一个选项。
关于c++ - 我可以在 MPI 并行代码中抛出异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3762728/