ホームページ  >  記事  >  バックエンド開発  >  マルチコア プログラミングにおける負荷分散の問題_PHP チュートリアル

マルチコア プログラミングにおける負荷分散の問題_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-20 11:05:401442ブラウズ

マルチコア CPU で複数の CPU のパフォーマンスを最大限に活用するには、各 CPU に割り当てられたタスクの負荷バランスが適切であることを確認する必要があります。そうしないと、一部の CPU が実行され、他の CPU がアイドル状態になり、マルチコア CPU の利点が活かされなくなります。


適切な負荷分散を実現するには、通常、静的負荷分散と動的負荷分散の 2 つのソリューションがあります。


1.静的負荷分散


静的負荷分散では、プログラムを並列実行可能な複数の部分に手動で分割する必要があり、分割された部分が均等に分散して実行できるようにする必要があります。つまり、高い加速係数を達成するには、ワークロードを複数のタスク間で均等に分散する必要があると言われています。


数学的に言えば、静的負荷分散問題は NP 完全問題であり、1972 年から 1983 年にかけて Richard M. Karp、Jeffrey D. Ullman、Christos H. Papadimitriou、M. Garey、D. Johnson らによって確認されました。いくつかの異なる制約の下での静荷重問題の NP 完全性が実証されています。


NP 完全問題は数学の難しい問題ですが、NP 完全問題は通常、解くための非常に効果的な近似アルゴリズムを見つけることができるため、タイトルで述べた難しい問題ではありません。


2. 動的負荷分散


動的負荷分散とは、負荷分散の目的を達成するために、プログラムの実行プロセス中にタスクを割り当てることです。実際には、静的な負荷分散では解決できない問題が多くあります。たとえば、ループの数が外部から入力される場合、ループの数は事前にわかりません。静的な負荷分散分割戦略を実装するのは困難です。


動的負荷分散におけるタスクのスケジューリングは、通常、システムによって実装されます。プログラマは、通常、動的分散スケジューリング戦略を選択することしかできず、実際のタスクには多くの不確実な要素があるため、スケジューリングアルゴリズムを変更することはできません。動的負荷分散は最適に行われるため、確立された負荷分散要件を満たさない場合があります。


3. 負荷分散の問題は何ですか?


負荷分散の問題は、負荷分散の程度を達成する必要があるということではありません。各 CPU に割り当てられたタスクの実行時間に多少のギャップがあっても、CPU コアの数が増加すると、合計の実行時間は長くなるからです。その結果、CPU コアの数が増えると加速係数も増加します。


負荷分散の難しさは、プログラム内の多数の並列実行ブロックをプログラマが分割する必要があることです。もちろん、デュアルコアや 4 コアなど、CPU コアの数が少ない場合、この分割は行われません。非常に難しい。しかし、コアの数が増えると、分割の粒度はさらに細かくなります。コアの数が 16 を超えると、プログラマはタスクをどのように分割するかにおそらく混乱するでしょう。たとえば、逐次実行されるコードを 128 コアの CPU で実行すると、手動で 128 個のタスクに分割する必要があり、その分割の困難さは容易に想像できます。


負荷分割の誤差は、CPU コアの数が増えるほど大きくなります。たとえば、16 時間単位かかるプログラムを 4 つのタスクに分割して実行すると、各タスクの平均負荷実行時間は 4 時間単位になります。誤差を 1 時間単位に分割すると、加速係数は 16/(4 1)=3.2 となり、理想的な状況での加速係数 4 の 80% になります。しかし、16 コア CPU で実行した場合、特定のタスクの除算誤差が 0.5 時間単位であれば、加速係数は 16/(1 0.5) = 10.67 となり、これはタスクの理想的な加速係数の 66.7% に過ぎません。図16に示すように、コア数がさらに増加すると、誤差が増幅されて理想加速係数に対する加速係数の比率が低下する。


負荷分割の問題は、CPU やソフトウェアのアップグレードにも反映されます。たとえば、4 コア CPU では負荷分割はバランスがとれていますが、8 コアや 16 コア CPU では負荷が分散される可能性があります。またアンバランス。ソフトウェアのバージョンアップでも同様で、ソフトウェアに機能が追加されると負荷バランスが崩れ、バランスをとるために負荷を再分割する必要があり、ソフトウェア設計の難易度や手間が大幅に増加します。


ロックが使用されている場合、一見バランスが取れているように見える一部の負荷が、ロックの競合によりアンバランスになる可能性があります。


4. 負荷分散の対策


計算量が少ないソフトウェアの場合、負荷分散が悪くても実際にはあまり影響はありません。負荷分散 考慮する必要があるのは、計算負荷が大きく大規模なソフトウェアであり、複数のコアを有効に活用してパフォーマンスを向上させるために、複数のコアで負荷分散する必要があります。


大規模なソフトウェアの場合、負荷分散戦略は、従来の方法のように特定のローカルなプログラムやアルゴリズムを対象とするのではなく、並列ブロックを分割するマクロ分割方法を開発し、ソフトウェアシステム全体のレベルから分割することです。並列分解。通常、ローカル プログラムを数十を超えるタスクに分解して実行するのは困難です。


もう 1 つの対処戦略はツール レベルです。つまり、コンパイル ツールは並列ブロックの手動分解を支援し、適切な分解ソリューションを見つけることができます。この点に関してインテルはある程度の努力を行ってきましたが、ツールの機能をより強力にするためにはさらなる努力が必要です。コア数が多い場合に対応します。


www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/445099.html技術記事マルチコア CPU で複数の CPU のパフォーマンスを最大限に活用するには、各 CPU に割り当てられたタスクの負荷バランスが適切であることを確認する必要があります。それ以外の場合は、一部の CPU が実行されており、他の CPU は実行されています...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。