16個のCPUを搭載したUbuntuサーバーがあります。 (nproc --all
見せて16
)
次の名前でbashスクリプトを作成しましたtest.sh
。
#!/bin/bash
while :
do
echo xxx
done
私はそれを練習した: ./test.sh >/dev/null &
。
その後、コマンドを使用してtop
CPU使用率を監視し、次のプロセスで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に分散させることは可能ですか?オペレーティングシステムがtest.sh
複数のCPUにプロセスを分散しないのはなぜですか?プロセスがtest.sh
十分に重くないからですか?それとも、このためにオペレーティングシステムをいくつか構成する必要がありますか?
答え1
シングルスレッドを複数のコアに分割することはできません。
複数のスレッド(コアごとに1つ)を持つようにプログラムを作成する必要があるか、複数のプログラムが必要です。そうでなければ、コアを使用しません。
より多くのコアを使用するようにプログラムを書くことはマイナーな問題ではなく、すべての問題を並列化できるわけではありません(複数のコアで実行するように書く)。問題に本質的にシーケンシャルコードが20%含まれている場合、無制限のプロセッサの元の実行時間(500%高速)よりも20%高速ではありません。その後、オーバーヘッド(スレッド間通信)があります。
コアアプリケーションがない場合は、それを販売してより安価なシステムを購入することをお勧めします。
シングルスレッドを処理するには、コアごとに多くの並列処理が必要ですが、これは目立たない。今、私たちはコアを追加しながら個々のコアを迅速に作成しようとしています。これは最初はうまくいきました。
Unixシステム(例:Gnu / Linux、Ubuntuなど)は、最大2→4まで追加のコアを効果的に活用します。 MicrosoftのWindowsには、ウイルススキャナ用のコア、最適化用のコア、その他すべての機能用のコアがあり、パフォーマンスが向上します。
それ以降は、マルチコア用に設計されたアプリケーションがある場合にのみ違いがあります。
答え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はコンピュータのコアと同じくらい多くのスレッドを作成し、スレッド間でワークロードを均等に分割します。