【问题标题】:Enable cancellation of openmp threads from inside program启用从程序内部取消 openmp 线程
【发布时间】:2018-03-10 23:36:35
【问题描述】:

根据 OpenMP 规范,OMP_CANCELLATION 必须设置为 true,这样#pragma omp cancel 之类的语句才能生效。我需要启用取消功能,我的程序才能正常工作(如果需要,一个 GUI 中止按钮会触发取消)。

我尝试在程序中设置OMP_CANCELLATION

setenv("OMP_CANCELLATION", "true", 1);

作为程序的第一行,但是这个语句没有任何作用。如果我在运行程序之前从外部的 shell 手动export OMP_CANCELLATION=true,则取消工作正常。

是否可以在程序内部启用取消而不需要在外部设置此环境变量?

【问题讨论】:

  • 也许在main() 运行之前就已经查询了该值?有一个线程here 至少表明这可能是不可能的(尽管它是关于 FORTRAN)。
  • 在 OpenMP ARB 的论坛 forum.openmp.org/forum/viewforum.php?f=3 上提问可能是值得的,这样参与标准的人就有可能注意到这个遗漏......

标签: c++ openmp cancellation


【解决方案1】:

根据standard (Chapter 4)是不可能的:

程序启动后对环境变量的修改,即使由程序本身修改,也会被 OpenMP 实现忽略。但是,某些 ICV 的设置可以在 OpenMP 程序执行期间通过使用适当的指令子句或 OpenMP API 进行修改 例行公事。

没有指定修改cancel-var值的方法(2.3.3)。

您可以通过编写包装程序/脚本来解决该问题。

有些实现可以提供修改值的方法,而不管标准怎么说。但依赖它是不可移植的。

【讨论】:

    【解决方案2】:

    虽然无法在程序启动后启用取消(根据 Zulan 的回答),但我设法找到了解决方法:

    char *hasCancel = getenv("OMP_CANCELLATION");
    if (hasCancel == nullptr) {
        printf("Bootstrapping...");
        setenv("OMP_CANCELLATION", "true", 1);
        // Restart the program here
        int output = execvp(argv[0], argv);
        // Execution should not continue past here
        printf("Bootstrapping failed with code %d\n",output);
        exit(1);
    } else {
        puts("Bootstrapping complete");
    }
    

    我在程序中设置变量,然后使用 exec 调用重新启动进程。重新启动的进程将在启动前正确设置OMP_CANCELLATION

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多