私は 16 個の CPU を搭載した Ubuntu サーバーを持っています。(nproc --all
表示16
)
以下のような名前の bash スクリプトを作成しましたtest.sh
。
#!/bin/bash
while :
do
echo xxx
done
実行しました: ./test.sh >/dev/null &
。
次に、CPU の使用状況を監視するコマンドを使用したtop
ところ、プロセスが原因で 1 つの CPU がほぼ 100% 使用されていることがわかりましたtest.sh
。
6411 me 20 0 11240 3052 2852 R 93.8 0.0 0:11.71 test.sh
%Cpu5 : 96.7 us, 3.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
ご覧のとおり、プロセスはtest.sh
5 番目の CPU に割り当てられており、ほぼ 100% 使用されています。
CPU をもっと活用できるように、負荷の高いプロセスを複数の CPU に割り当てることは可能ですか? なぜ OS はプロセスをtest.sh
複数の CPU に割り当てないのですか? プロセスのtest.sh
負荷が十分でないからでしょうか、それとも OS がそうするように何らかの設定を行う必要があるのでしょうか?
答え1
1 つのスレッドを複数のコア間で分割することはできません。
プログラムは複数のスレッド (コアごとに 1 つ) を持つように記述するか、複数のプログラムが存在する必要があります。そうでない場合は、コアは使用されません。
より多くのコアを使用するプログラムを書くのは簡単ではありませんし、すべての問題を並列化できるわけではありません (複数のコアで実行するように書く)。問題に基本的にシーケンシャルなコードが 20% 含まれている場合、プロセッサの数が無制限であれば、元の実行時間の 20% より速くはなりません (速度が 500% 向上します)。さらに、オーバーヘッド (スレッド間の通信) もあります。
コアを使用する用途がない場合は、コアを売却して、より安価なマシンを入手したほうがよいでしょう。
各コアは単一のスレッドを処理するために大量の並列処理を行いますが、これは目に見えません。現在、コアを追加しながら、単一のコアをさらに高速化することに苦労しています。これは最初はうまく機能します。
Unix システム (Gnu/Linux、たとえば Ubuntu など) は、最大 2 → 4 程度までの追加コアの使用をうまく行います。Microsoft の Windows では、ウイルス スキャナー用のコア、デフラグ ツール用のコア、その他すべて用のコアを 1 つずつ用意すると、パフォーマンスが向上します。
その後は、マルチコア用に設計されたアプリケーションがある場合にのみ違いが生じます。
答え2
複数のプロセッサを使用できる Linux コマンドの例を次に示します。
make -j
gcc -pipe
このmake
オプションは、 で大規模なプロジェクトをコンパイルするときに特に役立ち、簡単ですgcc
。
-fopenmp
gcc を呼び出すときに、ビルド オプションにオプションを追加します。for ループのすぐ上に次のプラグマを追加してみてください。
#pragma omp parallel for for(i=0; i<8000000000; i++) { ptr[i] = i/10000; }
デフォルトでは、OpenMP はマシンのコアと同じ数のスレッドを作成し、それらの間でワークロードを均等に共有します。