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.

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.