OpenMP: "libgomp: Thread creation failed: Resource temporarily unavailable" when code run as regular

Posted by Zora Stowers on Tuesday, May 21, 2024

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

5

2 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....

1

Problem 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