c++ - 我可以在 MPI 并行代码中抛出异常吗?

标签 c++ exception parallel-processing

这些是我在为应该使用 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/

相关文章:

c++ - 从排序数组中删除重复项

c++ - 为什么 vector.size() 函数会给我一个错误?

c++ - 使用 try-Catch 异常处理程序和 if else 条件检查之间的区别?

r - doRedis workers 在 windows 上立即关闭

python - Python à la Grand Central Dispatch 中的并行处理?

c++ - 缓慢的 opencv 调整大小函数执行时间

c++ - 这段代码安全吗? (链表,C++)

c# - 我应该使用哪个 .NET 异常来指示外部应用程序失败?

c - 如何卸载不间断(浮点异常时继续)模式?

c# - 并行处理一组 url 并返回一个 IEnumerable