从程序内部启用openmp线程的取消

时间:2017-09-29 05:45:32

标签: c++ openmp cancellation

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

我尝试使用

在程序中设置OMP_CANCELLATION
setenv("OMP_CANCELLATION", "true", 1);

作为程序的第一行,但此声明没有任何效果。如果我在运行程序之前从shell外部手动export OMP_CANCELLATION=true,则取消工作正常。

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

2 个答案:

答案 0 :(得分:1)

根据standard (Chapter 4)

是不可能的
  

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

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

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

有些实现可以提供修改值的方法,无论标准是什么。但依靠它是不可移植的。

答案 1 :(得分:0)

虽然一旦程序启动就无法启用取消(根据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