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
相关产品推荐
相关产品推荐

