OpenMP: «libgomp: создание потока не удалось: ресурс временно недоступен», когда код запускается как обычный пользователь - PullRequest
0 голосов
/ 17 ноября 2018

Когда я запускаю следующий пример кода:

#include "stdio.h"
#include <omp.h>

int main(int argc, char *argv[])
{
  #pragma omp parallel
  {
   int NCPU,tid,NPR,NTHR;
    /* get the total number of CPUs/cores available for OpenMP */
   NCPU = omp_get_num_procs();
   /* get the current thread ID in the parallel region */
   tid = omp_get_thread_num();
   /* get the total number of threads available in this parallel region */
   NPR = omp_get_num_threads();
   /* get the total number of threads requested */
   NTHR = omp_get_max_threads();
   /* only execute this on the master thread! */

   if (tid == 0) {
     printf("%i : NCPU\t= %i\n",tid,NCPU);
     printf("%i : NTHR\t= %i\n",tid,NTHR);
     printf("%i : NPR\t= %i\n",tid,NPR);
   }
   printf("%i : hello multicore user! I am thread %i out of %i\n",tid,tid,NPR);
  }
  return(0);
 }

с командой: gcc -fopenmp example.c -o example.exe затем ./example я получаю ошибку: libgomp: Thread creation failed: Resource temporarily unavailable Однако, когда я запускаю этот же код и команду вsudo Я получаю ожидаемый результат:

0 : NCPU    = 4
0 : NTHR    = 4
0 : NPR = 4
2 : hello multicore user! I am thread 2 out of 4
1 : hello multicore user! I am thread 1 out of 4
0 : hello multicore user! I am thread 0 out of 4
3 : hello multicore user! I am thread 3 out of 4

Я использую Ubuntu 18.04 на архитектуре x86_64 с 4 ядрами.

Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              4
On-line CPU(s) list: 0-3
Thread(s) per core:  2
Core(s) per socket:  2
Socket(s):           1
NUMA node(s):        1
Vendor ID:           GenuineIntel
CPU family:          6
Model:               78
Model name:          Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz

Мне не очень комфортно работать с кодом c с Openmp в качестве rootпользователь.Мой вопрос: может ли кто-нибудь предоставить информацию о том, почему это может происходить?Спасибо

1 Ответ

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

Проблема решена! Я назначал нужный мне стек с помощью ulimit -s <stack-size>, а не setrlimit(), потому что не верил, что setrlimit() работает.

ulimit -s использует килобайты, а setrlimit() использует байты. Я пытался назначить 32388608 килобайт, а не байтов!

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

со страницы руководства setrlimit():

Жесткий предел действует как верхний предел для мягкого предела: непривилегированный процесс> может только установить свой мягкий предел на значение в диапазоне от 0 до жесткого ограничить, и (необратимо) снизить его жесткий предел.

Привилегированный процесс ... может вносить произвольные изменения в любое предельное значение.

...