当我运行以下示例代码时:
#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
我在具有4个内核的x86_64体系结构上运行Ubuntu 18.04。
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
我真的不觉得以root用户身份使用Openmp运行C代码。我的问题是,有人可以提供有关为什么会发生这种情况的信息吗? 谢谢
答案 0 :(得分:0)
问题解决了!
我正在为ulimit -s <stack-size>
分配所需的堆栈限制,而不是通过setrlimit()
进行分配,因为我不相信setrlimit()
在起作用。
ulimit -s
使用千字节,setrlimit()
使用字节。
我试图分配 32388608 千字节而不是字节!
以root身份运行允许我执行此操作,但是假定普通用户Im不允许使用那么多的内存。
在setrlimit()
手册页中:
硬限制充当软限制的上限:无特权的进程>只能将其软限制设置为从0到硬限制的值 限制,并且(不可逆地)降低其硬限制。
特权进程...可以对两个限制值进行任意更改。