[解決済み] OpenMP:「libgomp: スレッドの作成に失敗しました。一般ユーザーでコードを実行すると、「Resource temporarily unavailable」。
質問
以下のサンプルコードを実行すると
#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 からハードリミットまでの範囲内の値にのみ設定できます。 また、ハードリミットを(不可逆的に)下げることもできます。
特権を持つプロセスは、...どちらの制限値も任意に変更することができます。
関連
-
[解決済み] Connect: ソケット以外でのソケット操作
-
[解決済み】警告:互換性のないポインタ型からの代入
-
[解決済み】ポインタへの代入時に互換性のないポインタ型からの初期化警告が発生した
-
[解決済み】エラー:'for'ループの初期宣言はC99モードでしかできない【重複
-
[解決済み】「無効なイニシャライザー」と表示されるのですが、何が間違っているのでしょうか?
-
[解決済み】ヒープ割り当てで初期化されていない値が作成された
-
[解決済み】C 未知の型名「my_structure」。
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み】C言語でint64_t型を表示する方法
-
[解決済み】MPI通信でMPI_Bcastを使用する場合
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み】警告:組み込み関数'printf'の非互換な暗黙の宣言(デフォルトで有効]
-
[解決済み】sizeof float (3.0) vs (3.0f)
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み】0LLや0x0ULの意味は何ですか?
-
[解決済み】未定義参照 makefile が間違っているのかも?
-
[解決済み】C言語のフォーマット文字列でデータ引数が使用されない [重複]。
-
[解決済み】Makefile:1: ***セパレータがありません。停止します。
-
[解決済み】execvp: バッドアドレスエラー
-
[解決済み】配列型char[]が代入できない [重複]。