Разрешить отмену потоков openmp изнутри программы

Согласно спецификации OpenMP, OMP_CANCELLATION должно быть установлено в true для таких операторов, как #pragma omp cancel иметь какой-либо эффект. Мне нужно, чтобы функция отмены была включена для моей программы, чтобы работать должным образом (кнопка прерывания GUI, которая вызывает отмену, если это имеет значение).

Я пытался установить OMP_CANCELLATION изнутри программы с

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

как первая строка программы, но это утверждение не имеет никакого эффекта. Если я вручную export OMP_CANCELLATION=true из оболочки снаружи перед запуском программы, отмена работает правильно.

Можно ли включить отмену изнутри программы, не требуя установки внешней переменной среды?

0

Решение

Это невозможно в соответствии с стандарт (глава 4):

Изменения переменных среды после запуска программы, даже если они были изменены самой программой, игнорируются реализацией OpenMP. Тем не менее, настройки некоторых из ICV могут быть изменены во время выполнения программы OpenMP с помощью соответствующих положений директивы или OpenMP API
Подпрограммы.

Нет такого способа изменить значение отменить-вар уточняется (2.3.3).

Вы можете решить эту проблему, написав программу / скрипт-обертку.

Некоторые реализации могут предоставлять способы изменения значения независимо от того, что говорится в стандарте. Но полагаться на это не было бы портативным.

1

Другие решения

Хотя невозможно отменить отмену после запуска программы (согласно ответу Зулана), мне удалось найти обходной путь:

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 Правильно настроен перед началом.

0