根据OpenMP规范,OMP_CANCELLATION
必须设置为true才能使#pragma omp cancel
之类的语句产生任何效果。我需要启用取消功能才能让我的程序正常工作(如果重要的话,会触发取消的GUI中止按钮)。
我尝试使用
在程序中设置OMP_CANCELLATION
setenv("OMP_CANCELLATION", "true", 1);
作为程序的第一行,但此声明没有任何效果。如果我在运行程序之前从shell外部手动export OMP_CANCELLATION=true
,则取消工作正常。
是否可以在程序中启用取消而无需在外部设置此环境变量?
答案 0 :(得分:1)
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
。