1. ホーム
  2. c

[解決済み] OpenMP:「libgomp: スレッドの作成に失敗しました。一般ユーザーでコードを実行すると、「Resource temporarily unavailable」。

2022-02-15 13:17:47

質問

以下のサンプルコードを実行すると

#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

Openmpを使ったcコードをrootユーザで実行するのは、あまり気が進まないのですが。私の質問は、なぜこのようなことが起こるのか、どなたか情報を提供していただけないでしょうか? ありがとうございます。

解決方法を教えてください。

問題解決 必要なスタック制限を ulimit -s <stack-size> で行うのとは対照的に setrlimit() というのは、私は setrlimit() は機能していた。

ulimit -s はキロバイトを使用し setrlimit() はバイトを使用します。 を割り当てようとしたのですが 32388608 バイトではなくキロバイト

ルートで実行することで、このようなことが可能になりましたが、通常のユーザーでは、これほど多くのメモリを使用することはできません。

からの setrlimit() のマニュアルページをご覧ください。

ハードリミットは、ソフトリミットの上限として機能します。非特権プロセス > は、ソフトリミットを 0 からハードリミットまでの範囲内の値にのみ設定できます。 また、ハードリミットを(不可逆的に)下げることもできます。

特権を持つプロセスは、...どちらの制限値も任意に変更することができます。