2つのCPUにプロセスをデプロイする方法

2つのCPUにプロセスをデプロイする方法

16個のCPUを搭載したUbuntuサーバーがあります。 (nproc --all見せて16

次の名前でbashスクリプトを作成しましたtest.sh

#!/bin/bash


while :
do
    echo xxx
done

私はそれを練習した: ./test.sh >/dev/null &

その後、コマンドを使用してtopCPU使用率を監視し、次のプロセスで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.sh5番目の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

  • -fopenmpgccを呼び出すときは、ビルドオプションにこのオプションを追加してください。

  • forループの上に次のプラグマを追加してみてください。

    #pragma omp parallel for
    for(i=0; i<8000000000; i++) {
        ptr[i] = i/10000;
    }
    

デフォルトでは、OpenMPはコンピュータのコアと同じくらい多くのスレッドを作成し、スレッド間でワークロードを均等に分割します。

関連情報