Как программа GNU Fortran / OpenMP может устанавливать и извлекать Stacksize-var ICV? - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь создать стороннюю программу OpenMP с gfortran / libgomp, но у меня возникают проблемы с использованием расширений для получения и установки ICV stacksize-var .Источник поставляется с альтернативами для Intel Fortran (kmp_get_stacksize() и kmp_set_stacksize()) и для компилятора Portland Group (omp_get_stack_size() и omp_set_stack_size()), но как можно добиться того же с GNU Fortran и libgomp?

Мне известны переменные окружения OMP_STACKSIZE и GOMP_STACKSIZE, но, насколько я понимаю, фактический ICV является отдельным, так что программная установка одного из них после запуска программы не повлияет на ICV и что чтение одногосообщает только об этой переменной среды, но не об ICV.

Допустимо, чтобы решение было специфичным для gfortran и / или libgomp, работающих в Linux.

Я использую gfortran и libgompиз GCC 4.8.5.

1 Ответ

0 голосов
/ 19 ноября 2018

Сам стандарт не позволяет модифицировать или получить stacksize-var ICV.Так что вы обречены использовать решения, специфичные для реализации.

Теперь libgomp перенаправляет значения , заданные переменными среды , прямо в pthread .

Итак, выМожно сказать, что libgomp хранит stacksize-var в gomp_thread_attr.К сожалению, это кажется локальным символом в libgomp, и я не верю, что вы можете разумно получить к нему доступ.

libgomp initialize_env уже вызывается во время инициализации библиотеки, а не в первой параллельной области, поэтому изменениепеременная окружения фактически не эффективна.

Для неосновных потоков вы можете по крайней мере прочитать фактическое значение.Хотя pthread может использовать выровненный размер стека, он может не совпадать со значением, указанным в libgomp.

size_t stacksize;
pthread_attr_t attr;
// TODO check return values
pthread_getattr_np(pthread_self(), &attr);
pthread_attr_getstacksize(&attr, &stacksize);
...