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



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

我尝试从程序内设置OMP_CANCELLATION

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

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

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

尽管程序启动后无法启用取消(根据 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 %dn",output);
exit(1);
} else {
puts("Bootstrapping complete");
}

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

根据标准(第 4 章)这是不可能的:

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

没有指定修改取消变量值的方法 (2.3.3)。

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

一些实现可以提供修改值的方法,而不管标准说什么。但依靠这一点是不可移植的。

最新更新