根据 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)。
您可以通过编写包装程序/脚本来解决这个问题。
一些实现可以提供修改值的方法,而不管标准说什么。但依靠这一点是不可移植的。