When I run the following example code:
#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); }
with the command: gcc -fopenmp example.c -o example.exe
then ./example
I get the error: libgomp: Thread creation failed: Resource temporarily unavailable
However, when I run this same code and command under sudo
I get the expected output:
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
Im running Ubuntu 18.04 on x86_64 architecture with 4 cores.
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
I dont really feel comfortable running c code with Openmp as root user. My question is, could someone provide information as to why this may be happening? Thanks
52 Answers
fix the error :
"libgomp: Thread creation failed: Resource temporarily unavailable"
specialy in systems that have only 1-cpu, only need to reduce threads :
export OMP_NUM_THREADS=1
and go on....
1Problem solved! I was assigning the stack limit I need with ulimit -s <stack-size>
as opposed to doing it with setrlimit()
because I didnt believe that setrlimit()
was working.
ulimit -s
uses kilobytes and setrlimit()
uses bytes. I was trying to assign 32388608 kilobytes rather than bytes!
Running as root allowed me to do this however a regular user Im assuming was not allowed utilize that much memory.
From the setrlimit()
man page:
The hard limit acts as a ceiling for the soft limit: an unprivileged process > may only set its soft limit to a value in the range from 0 up to the hard limit, and (irreversibly) lower its hard limit.
A privileged process ... may make arbitrary changes to either limit value.
ncG1vNJzZmirpJawrLvVnqmfpJ%2Bse6S7zGiorp2jqbawutJobGxrZWZ%2BeoCOqKeepp2leq21waCmpqhdqbWzscCdZJyqlZbBqrvNZp2aoZyasW6%2BxKymrqqTmnq1scyppquZop65unnUp5ivmZmhrqO4xGauoZ2e