Согласно спецификации OpenMP, OMP_CANCELLATION
должно быть установлено в true для таких операторов, как #pragma omp cancel
иметь какой-либо эффект. Мне нужно, чтобы функция отмены была включена для моей программы, чтобы работать должным образом (кнопка прерывания GUI, которая вызывает отмену, если это имеет значение).
Я пытался установить OMP_CANCELLATION
изнутри программы с
setenv("OMP_CANCELLATION", "true", 1);
как первая строка программы, но это утверждение не имеет никакого эффекта. Если я вручную export OMP_CANCELLATION=true
из оболочки снаружи перед запуском программы, отмена работает правильно.
Можно ли включить отмену изнутри программы, не требуя установки внешней переменной среды?
Это невозможно в соответствии с стандарт (глава 4):
Изменения переменных среды после запуска программы, даже если они были изменены самой программой, игнорируются реализацией OpenMP. Тем не менее, настройки некоторых из ICV могут быть изменены во время выполнения программы OpenMP с помощью соответствующих положений директивы или OpenMP API
Подпрограммы.
Нет такого способа изменить значение отменить-вар уточняется (2.3.3).
Вы можете решить эту проблему, написав программу / скрипт-обертку.
Некоторые реализации могут предоставлять способы изменения значения независимо от того, что говорится в стандарте. Но полагаться на это не было бы портативным.
Хотя невозможно отменить отмену после запуска программы (согласно ответу Зулана), мне удалось найти обходной путь:
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
Правильно настроен перед началом.