You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenMP是否禁止在单线程运行的并行区域内抛出异常?

OpenMP并行区域内临界区抛异常的合规解决方案疑问

我需要并行化一个循环,采用#pragma omp parallel加#pragma omp for的结构,且parallel指令带有if(will_parallelize)条件。循环内调用的函数中存在#pragma omp critical (MyName)临界区,区内代码可能抛出异常。

我的逻辑是:在并行区域外判断是否可能抛出异常,若可能则设will_parallelize为false以单线程运行;否则设为true并行运行。但当will_parallelize为false时,抛出异常会导致程序终止,报错libc++abi: terminating due to uncaught exception of type std::runtime_error。

我原以为仅多线程运行时禁止抛异常,单线程时临界区是无操作,可正常抛异常,但实际并非如此。我有两个核心疑问:

  • 是否即使单线程运行,在OpenMP并行区域内也禁止抛出异常?
  • 如果确实如此,如何在不重复代码的前提下合规解决这个问题?

我考虑过两种方案,但都会导致代码重复:

  • 手动判断will_parallelize来拆分代码,分别处理单线程和并行逻辑
  • 在嵌套函数中用omp_in_parallel()区分临界区的处理逻辑

想了解OpenMP规范的具体要求,以及更优雅的解决方案。

内容的提问来源于stack exchange,提问作者bhaller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 03:07:05